2017-10-21 4 views
1

私は、私たちがクラスでやっている単純な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 

答えて

1

はい、それはscanf機能です。ここでは%sのフォーマットのために、と言い、scanf関数のためのLinuxのmanページです:


マッチ非ホワイトスペース文字のシーケンスは。次の ポインターは、入力シーケンスを保持するのに十分な長さの文字 配列の最初の要素へのポインターでなければならず、自動的に追加される末尾のヌルバイト( '\ 0')は です。 入力文字列は、空白文字または最大フィールド幅( )のいずれか早い方で終了します。あなたがやりたい

は、read()getc()、またはfgets()を使用してstdinから直接文字を自分で読んで。

+1

scanf形式の精度はありません.printf形式のみです。 's'変換に最低限の文字数を指定する方法はなく、空白を読み込む方法もありません。より良いアプローチは '%20 [^ \ n]' –

+0

@ChrisDoddです。私のプログラムが空白を読むことができるようになりましたので、私は今、sを持ってはいけないと推測しています。とにかく私はscanfと空白を読むことができますか? –

+0

@ChrisDodd%20 [^ \ n]を使用して文字列を入力した後にEnterキーを押すと、それ以上の入力を読み込もうとしているような何もしません。 –