77

私は現在、Ritchie & Kernighan による C プログラミング言語という本を読んでいます。そして、関数での EOF の使用法についてかなり混乱していgetchar()ます。

まず、なぜ EOF の値が -1 で、なぜ の値getchar()!=EOFが 0 なのか知りたいです。私は実際に試しましたが、できません。

次に、以下のコードを使用して文字数をカウントできる書籍の例を実行しようとしましたが、Enter キーを押してもループから抜け出せないようで、いつ EOF に到達するのでしょうか?

main(){
   long nc;
   nc = 0;
   while (getchar() != EOF)
       ++nc;
   printf("%ld\n", nc);
}

次に、Problem with EOF in Cで同じ問題を読みました。ほとんどの人は、EOF を使用する代わりに、ターミネータ \n または null ターミネータ '\0' を使用することをお勧めします。これは非常に理にかなっています。

本の例が別の目的を果たしているということですか?

4

3 に答える 3

105

EOF は「ファイルの終わり」を示します。改行 (Enter キーを押すと発生します) はファイルの末尾ではなく、の末尾であるため、改行はこのループを終了しません。

コードは間違っていません[*]、期待しているように見えないだけです。入力の最後まで読み込みますが、行末までだけ読みたいようです。

getcharEOF の値は、実際の文字からの戻り値とは異なる必要があるため、-1 です。そのgetcharため、任意の文字値を int に変換された unsigned char として返します。したがって、これは負ではありません。

端末で入力していて、ファイルの終わりを引き起こしたい場合は、CTRL-D (UNIX スタイルのシステム) または CTRL-Z (Windows) を使用します。次に、すべての入力が読み取られた後、getchar()が返さEOFれ、したがってgetchar() != EOFfalse になり、ループが終了します。

[*] 入力が LONG_MAX 文字を超えた場合、整数オーバーフローのために未定義の動作をしますが、単純な例ではおそらくそれを許すことができます。

于 2010-12-05T12:26:06.080 に答える
22

EOF は、そのように定義されているため、-1 です。名前は、標準ライブラリ ヘッダーによって提供されます#include。によって読み取られる実際のバイトと間違えられないものでなければならないため、-1 に等しくなりますgetchar()getchar()正の数 (0 から 255 までを含む) を使用して実際のバイトの値を報告するため、これには -1 が適切に機能します。

!=演算子は「等しくない」という意味です。0 は false を表し、それ以外は true を表します。つまり、getchar()関数を呼び出して、結果を -1 (EOF) と比較します。結果が EOF と等しくない場合、等しくないものは等しくないため、結果は true です。結果が EOF に等しい場合、等しいものは等しくない (等しくない) ため、結果は false です。

getchar()「ファイルの終わり」に到達すると、への呼び出しは EOF を返します。C に関する限り、「標準入力」 (コマンド ウィンドウに入力してプログラムに与えるデータ) はファイルのようなものです。もちろん、いつでももっと入力できるので、「完了しました」と明示的に言う方法が必要です。Windows システムでは、これは control-Z です。Unix システムでは、これは control-D です。

本の例は「間違っている」わけではありません。実際に何をしたいかによります。EOF まで読み取るとは、ユーザーが「完了しました」と言うまですべてを読み取り、それ以上読み取ることができないことを意味します。'\n' まで読み取るということは、入力行を読み取ることを意味します。コマンドプロンプトでキーボードを使用してこのバイトを生成することは困難または不可能であるため、ユーザーが入力を入力することを期待している場合、「\0」まで読み取ることは悪い考えです:)

于 2010-12-05T12:26:40.093 に答える
9

それはたくさんの質問です。

  1. -1 の理由EOF: 通常、POSIX システム コールの -1 はエラー時に返されるため、「EOF は一種のエラーです」という考え方だと思います。

  2. ブール演算 (!= を含む) は、TRUE の場合は 1 を返し、FALSE の場合は 0 を返します。FALSE の場合も同様で、getchar() != EOF返され0たことを意味します。getchar()EOF

  3. プレスEOFから読み取るときにエミュレートするためstdinCtrl+D

于 2010-12-05T12:24:22.587 に答える