Удаление пространств из строки в MIPS

66
10

В настоящее время я пытаюсь написать код, который принимает строку и выводит ту же строку без пробелов. Все в моем коде в настоящее время работает, но выходы не удаляют предыдущие значения строки. Например, если вход "jack and jill взбежал на холм", выход будет "jackandjillranup thehill hill". Кажется, что моя строка все еще держится за старые значения. Кто-нибудь знает, почему это делается и как это исправить?

.data 
string1: .space 100
string2: .space 100
ask: .asciiz "Enter string: "
newstring: .asciiz "New string:\n"

.text

main:
la $a0,ask #ask for string1
li $v0,4
syscall

#load String1
la $a0,string1
li $a1, 100
li $v0,8 #get string
syscall

load:
la $s0,string1 #Load address of string1 into s0
lb $s1, ($s0) #set first char from string1 to $t1
la $s2 ' ' #set s2 to a space
li $s3, 0 #space count

compare:
#is it a space?
beq $s1, $zero, print #if s1 is done, move to end
beq $s1, $s2, space #if s1 is a space move on
bne $s1, $s2, save #if s1 is a character save that in the stack

save:
#save the new string
sub $s4, $s0, $s3,
sb $s1, ($s4)
j step

space:
addi $s3, $s3, 1 #add 1 if space

step:
addi $s0, $s0, 1 #increment first string array
lb $s1, ($s0) #load incremented value
j compare

print:
#tell strings
la $a0, newstring
li $v0,4
syscall

#print new string
la $a0, string1
li $v0, 4
syscall

end:
#end program
li $v0, 10
syscall #end

спросил(а) 2021-01-19T15:34:01+03:00 9 месяцев, 1 неделя назад
1
Решение
91

Строки NULL завершены, вы должны переместить этот завершающий NULL в новый конец строки.

На боковой ноте вы могли бы сделать все на месте (для удобства в C-коде :)

#include <stdio.h>

int main() {
char string1[100];
fgets (string1, 100, stdin);
char *inptr = string1; //could be a register
char *outptr = string1; //could be a register
do
{
if (*inptr != ' ')
*outptr++ = *inptr;
} while (*inptr++ != 0); //test if the char was NULL after moving it
fputs (string1, stdout);
}

ответил(а) 2021-01-19T15:34:01+03:00 9 месяцев, 1 неделя назад
46

Это еще один способ удалить пробелы из жало и распечатать его обратно. просто зациклируйте строку и игнорируйте пробелы.


    .text
main:
li $v0, 4
la $a0, prompt
syscall

li $v0, 8
la $a0, input
li $a1, 100
syscall

move $s0, $a0

loop:
lb $a0, 0($s0)
addi $s0, $s0, 1
beq $a0, 32, loop
beq $a0, $zero, done

li $v0, 11
syscall

j loop

done:
jr $ra

.data
prompt: .asciiz "Enter a string: "
input: .space 100

ответил(а) 2021-01-19T15:34:01+03:00 9 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема