1

ちょっと意味のわからないアセンブリ コードのスニペットがあります

.text:004016C5 prompt_uid:             ; "[ User %d    ]\t"
.text:004016C5 mov     [esp+0Ch+var_C], offset aUserD
.text:004016CC mov     ecx, [ebp+arg_0]
.text:004016CF mov     [esp+0Ch+var_8], ecx
.text:004016D3 call    printf
.text:004016D8 mov     [esp+0Ch+var_C], esi
.text:004016DB call    gets
.text:004016E0 test    eax, eax        ; test eax=0
.text:004016E2 jz      short prompt_uid

test eax,eax最初はと にjz続くに戸惑いましたgets

「入力が 0 になるのはなぜですか?」. 次に、「わかりました。文字列はnullbyteで終了するため、空の文字列はテスト設定ZFになるはずです」と思いました

しかし、実際にテストしたところ、jz は取得されませんでした。プロンプトでEnterキーを押しただけでも。

私の間違いはどこですか?

4

1 に答える 1

1

get ()参照は、NULLを返すタイミングに対する答えを提供します。

戻り値

正常に完了すると、gets()はsを返します。ストリームがファイルの終わりにある場合、ストリームのファイルの終わりインジケータが設定され、gets()はnullポインタを返します。読み取りエラーが発生した場合、ストリームのエラーインジケータが設定され、gets()はnullポインタ[CX]を返し、エラーを示すためにerrnoを設定します。

つまり、gets()通常の「プレスリターン」操作ではなく、ファイルの終わりまたは読み取りエラーでNULLを返す場合があります。

于 2012-10-24T12:50:17.557 に答える