2017-10-21 140 views
1

我,我們這樣做是爲了類簡單的64位彙編程序。它應該接受用戶輸入(字符串)並將小寫字母的字符串返回成大寫和小寫。MASM X86-64 SCANF不讀書空間

與我有什麼,它會直到它找到一個空間讀取任何東西,這會不會以後再閱讀。所以如果我輸入「test」,它會輸出「TEST」。如果我輸入「Test Test」,它會輸出「TEST」。但是,如果我在第一個單詞之前添加空格,它會輸出第一個單詞但刪除空格。例如:輸入「TesT」,輸出:「tESt」。 任何人都知道我可以如何解決這個問題? 這裏是我的整個程序:

;Author: Keenan Kaufman 
;Date: 10/20/2017 
INCLUDELIB msvcrt.lib 

printf PROTO 
scanf PROTO 
exit PROTO 

.DATA 
CRLF BYTE 0Dh, 0Ah, 0       ;carriage return 
msgHeader BYTE "Enter a mixed case string: ", 0 
message  BYTE 20 DUP(0), 0 
target  BYTE SIZEOF message DUP(?), 0Dh, 0Ah, 0 
msgformat BYTE "%20s", 0 

.CODE 
main PROC 
;Display request for user input 
     lea rcx, msgHeader 
     call printf 

;obtain user input 
     lea rcx, msgformat 
     lea rdx, message 
     call scanf 


     lea rsi, message 
     lea rdi, target 

     jmp GETNEXT 
GETNEXT: 
     mov al, [rsi] 
     cmp al, 0 
     je ENDCASE 
     cmp al, 'z' 
     ja NOCHANGE 
     cmp al, 'A' 
     jb NOCHANGE 
     cmp al, 'a' 
     jae TOUPPER 
     cmp al, 'Z' 
     jbe TOLOWER 

TOUPPER: 
     sub al, 32 
     mov [rdi], al 
     inc rdi 
     inc rsi 
     jmp GETNEXT 
TOLOWER: 
     add al, 32 
     mov [rdi], al 
     inc rdi 
     inc rsi 
     jmp GETNEXT 
NOCHANGE: 
     mov [rdi], al 
     inc rdi 
     inc rsi 
     jmp GETNEXT 
ENDCASE: 
     jmp FINISH 
FINISH: 
     ;Display target 
     lea rcx, target 
     call printf 
     lea rcx, CRLF 
     call printf 


     mov rax, 0 
     call exit 
main ENDP 
END 

回答

1

是的,這是一個功能scanf。這裏是Linux手冊頁scanf函數其中,用於%s格式,說:

小號
匹配的非空白的字符序列。下一指針 必須是指向一個字符 數組的初始元素,其足夠長以保持輸入序列和終止 空字節(「\ 0」),其自動添加。 輸入字符串停留在空白處或最大字段寬度, 以先發生者爲準。

做你想要什麼,自己直接從stdin使用read()getc(),或fgets()讀取字符。

+1

有沒有「精確」是scanf函數的格式 - 只printf的格式。沒有辦法在's'轉換中指定最少的字符數,並且沒辦法讓它讀取空格。更好的方法是'%20 [^ \ n]' –

+0

@ChrisDodd我希望我的程序能夠讀取空格,所以我現在猜測我不應該有這個s。無論如何,我可以使用scanf並閱讀空格? –

+0

@ChrisDodd當我使用%20 [^ \ n]並在輸入字符串之後回車時,它什麼也不做,就像它仍在嘗試讀取更多輸入。 –