EOFの値をCで出力したい。
char ch =getchar() ;
printf("%d",ch) ;
これにより、CTRL + Zを入力すると値-1が正しく出力されます(Windowsで作業しています)。
その間。
char ch ;
scanf("%c",&ch) ;
printf("%d",ch) ;
126を誤って印刷します。
この異常な動作の理由は何ですか?
EOFの値をCで出力したい。
char ch =getchar() ;
printf("%d",ch) ;
これにより、CTRL + Zを入力すると値-1が正しく出力されます(Windowsで作業しています)。
その間。
char ch ;
scanf("%c",&ch) ;
printf("%d",ch) ;
126を誤って印刷します。
この異常な動作の理由は何ですか?
scanfからの戻り値を確認していません。私はそれがゼロだったに違いない:パターンが一致しなかった。
値「126」は、の初期化されていない値ですch
。
編集:マニュアルページを詳しく調べると、戻り値はになりますEOF
。これは戻り値であり、に書き込まれる値ではないことに注意してくださいch
。
scanfが文字引数をEOFで埋めるという考えをあなたに与えたのは何ですか?
scanf関数はEOFにヒットし、変換に失敗して戻ります。chの値は、変数を宣言したときにスタックにあったランダムな値です。
EOFは、読み取られるファイルに含まれる可能性のある値と区別できるようにすることを目的としています。
そのため、ファイルから読み取っているときにEOFを受け取る可能性がある場合は、その値を保持するためにaを使用しないでください。char
を使用し、受け取ったものがEOFではないことを確認した後int
でのみ結果を変換する必要があります。正しい結果を得るには、次のようなものを試してください。char
int char;
ch = getchar();
printf("%d", ch);
2番目の例では、を使用してデータを読み取るscanf
場合、戻り値をチェックすることにより、読み取られたデータの量(存在する場合)を確認します。ファイルの終わりに遭遇した場合、入力の変換の試行を停止し、戻り値をチェックすることで、正常に変換されたフィールドの数を確認できます。EOFを変数に変換しようとはしません。
scanfの戻りコードを確認する必要があります。EOFを返す必要があります。この場合、charは影響を受けません。また、初期化されていない場合は126になる可能性があるためです。