Domanda

Nella mia classe di programmazione Assembly MIP Sono stato incaricato con la scrittura di un programma che converte una stringa in maiale semplificato latino.

maiale semplificata latino si assume tutte le parole nella stringa sono almeno 2 caratteri, e ogni parola ha la sua prima lettera spostata alla fine seguito da "ay". Inoltre, assumono non ci sono segni di interpunzione di alcun tipo.

Quindi, "StackOverflow è grande" diventa "tackoverfloway Siay reatgay".

Ho preso una pugnalata a questo programma e sto quasi completato. Funziona bene, tranne che per qualche motivo ho un'interruzione di linea nel mezzo del l'ultima parola ogni volta.

Ad esempio:

  

tackoverflowsay Siay reat
  Gay

Al posto di:

  

tackoverflowsay Siay reatgay

Ho provato decuding quello che sarebbe essere la causa interruzione di linea nella ultima porzione di uscita del mio programma, ma io non lo vedo. Devo una stringa nulla prematura terminato? Se lo faccio, io non lo vedo.

Qui è il mio codice:

####################################################
#  Text Segment
####################################################
        .text
        .globl main
main:
        la $t0, char
        la $t1, buffer
        lb $t3, space

        la $a0, prompt
        li $v0, 4
        syscall

        la $a0, buffer
        li $a1, 200
        li $v0, 8
        syscall

        lb $t2, ($t1)           # Load first char
        addi $t1, $t1, 1

loop:
        lb $t4, ($t1)           # Load next character into $t4

        addi $t1, $t1, 1
        beqz $t4, exit          # Reached end of string, exit?  
        beq $t3, $t4, loop2     # If $t4 = " " char, second loop

        move $a0, $t4           # else, lets keep printing chars
        li $v0, 11
        syscall

        j loop

loop2:
        move $a0, $t2
        li $v0, 11
        syscall

        la $a0, aystr
        li $v0, 4
        syscall

        lb $t2, ($t1)   
        addi $t1, $t1, 1    

        j loop
exit:

        move $a0, $t2
        li $v0, 11
        syscall

        la $a0, aystr
        li $v0, 4
        syscall

        li $v0, 10
        syscall         # Cya...

####################################################
#  Data Segment
####################################################

        .data
prompt: .asciiz "Enter Phrase: "
result: .asciiz "Pig Latin: "
space:  .ascii " "
aystr:  .asciiz "ay "
char:   .byte 1
buffer: .byte 200
È stato utile?

Soluzione

È quasi certamente avete una stringa della forma:

stackoverflow is great\n

dove \n è un carattere di nuova riga. Ciò si tradurrebbe in:

tackoverflowsay siahy reat\ngay

se semplicisticamente rilevato la fine della parola sia come spazio o nullo di terminazione.

Non ho intenzione di darvi il codice (perché questo è compito), ma la soluzione più semplice, a mio parere, sarebbe quella di avere un altro ciclo di elaborazione l'intera stringa, sostituendo tutti i caratteri "\n" con spazi.

Questo dovrebbe essere fatto prima che i loop latinizzazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top