1

我需要获取用户输入的字符,并使用递归将其插入到正确字母位置的字符串中,然后请求另一个字符。一次只能输入一个字符。

我认为一个好方法是扫描字符串,当输入的字符与字母字符串中的字符匹配时,然后插入它。但是我无法将其放入代码中。我还必须使用递归(堆栈、$jal、$jr $ra),但我并不完全熟悉如何使用它。

到目前为止,这是我的代码:

        .data

    str: .asciiz "abcdefghijklmnopqrstuvwxyz .space 30" 
    input: .asciiz "Please input a letter: "
    error1: .asciiz "Error! Please only enter one lowercase letter!"
    print1: .asciiz "The string is: "


    .text

    main:
    la $s0,0
    li $v0,4
    la $a0,input
    syscall

    loop:
    li $v0,8
    syscall
    move $t0,$v0
    blt $t0,61,error #if less than a
    bgt $t0,80,error #if more than z
    bge $t0,0x50,print #when user enters P, print

    loop2:
    lb $t2,str($s0) #load first byte of string
    bge $t0,$t2,store #if input char=string char, store it
    addi $s0,$s0,1 #next char in string
    j loop

    store:
    sw $t0,str($s0) #store char in string
    addi $s0,$s0,1 #next char in string
    j loop

    error:
    li $v0,4
    la $a0,error1 #print error message
    syscall
    j loop #jump back to loop

    print:
    li $v0,4
    la $a0,print1 #print dialogue
    syscall
    li $v0,4
    la $a0,str #print string
    syscall
4

1 回答 1

1

在解决任何其他问题之前,您需要明确此插入应该如何工作。您将获取一个字符并将其插入到预先存在的字符串中,对吗?如果是这样,那么这意味着您需要创建一个填充字符串的可修改缓冲区。该.space指令会做。此外,您需要分配一个大缓冲区,因为您将插入字符。最后,插入字符意味着转换,因此请为此做好准备。

目前,您有:

str: .asciiz "abcdefghijklmnopqrstuvwxyz"

我猜你要修改那个字符串,但字符串声明并不是要修改的。你可能可以修改它,甚至让你的程序工作,但我不建议这样做。如果您声明多个字符串(并且您确实这样做了),它们很可能会被连续放置,然后您将覆盖数据。在尝试询问用户输入之前,我会专注于解决所有问题。

然后你有以下内容:

loop:
    li $v0,8
    syscall
    move $t0,$v0

syscall 8读取一个字符串,而不是一个字符。syscall 12读取一个字符。在您尝试从控制台读取字符串时,您没有在$a0. 然后您尝试将系统调用的结果移动到临时寄存器中,但该调用不返回任何内容。它只将输入字符串放入缓冲区。

于 2012-04-18T20:07:40.927 回答