在MIPS中从字符串中删除空格

时间:2017-03-01 08:50:30

标签: string mips

我目前正在尝试编写一个代码,该代码接收一个字符串并输出相同的字符串,不带空格。我的代码中的所有内容当前都有效,但输出不会删除字符串的先前值。例如,如果输入是“jack and jill上山”,则输出为“jackandjillranupthehill 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

2 个答案:

答案 0 :(得分:0)

字符串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);
}

答案 1 :(得分:0)

这是从sting中移除空格并将其打印回来的另一种方法。简单地循环字符串并忽略空格。

    .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