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
有沒有「精確」是scanf函數的格式 - 只printf的格式。沒有辦法在's'轉換中指定最少的字符數,並且沒辦法讓它讀取空格。更好的方法是'%20 [^ \ n]' –
@ChrisDodd我希望我的程序能夠讀取空格,所以我現在猜測我不應該有這個s。無論如何,我可以使用scanf並閱讀空格? –
@ChrisDodd當我使用%20 [^ \ n]並在輸入字符串之後回車時,它什麼也不做,就像它仍在嘗試讀取更多輸入。 –