Удаление пространств из строки в MIPS
В настоящее время я пытаюсь написать код, который принимает строку и выводит ту же строку без пробелов. Все в моем коде в настоящее время работает, но выходы не удаляют предыдущие значения строки. Например, если вход "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
Строки 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);
}
Это еще один способ удалить пробелы из жало и распечатать его обратно. просто зациклируйте строку и игнорируйте пробелы.
.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