私は、私たちがクラスでやっている単純な64ビットアセンブリプログラムを持っています。ユーザー入力(文字列)を取り、その文字列を小文字で大文字と大文字を小文字に変換します。MASM x86-64 scanf not read spaces
私が持っているものでは、スペースを見つけるまで何も読み込まれず、それ以降は読み込まれません。だから、 "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]を使用して文字列を入力した後にEnterキーを押すと、それ以上の入力を読み込もうとしているような何もしません。 –