C言語のファイル終端(EOF)
質問
現在、Ritchie & KernighanのC Programming Languageという本を読んでいます。でのEOFの使い方について、かなり混乱しています。
getchar()
関数のEOFの使い方についてかなり混乱しています。
まず、なぜEOFの値が-1なのか、そしてなぜ
getchar()!=EOF
私の質問で申し訳ありませんが、私は本当に理解していません。私は本当に試みたが、私はできません。
それから、下のコードで文字数を数えることができる本の例を実行してみましたが、エンターキーを押してもループから抜け出せないようなので、いつEOFになるのかが気になるところです。
main(){
long nc;
nc = 0;
while (getchar() != EOF)
++nc;
printf("%ld\n", nc);
}
次に、同じ問題を C言語におけるEOFの問題 . 多くの人が、EOFを使う代わりに、ターミネータ(終端記号)の "閾値 "かヌルターミネータ "閾値0 "を使えとアドバイスしていて、とても理にかなっていると思いました。
本に載っている例は別の目的を持っているということでしょうか?
どのように解決するのですか?
EOFは"end of file"を表します。改行 (これは Enter キーを押したときに起こるものです) は ファイルの終わりではありません。 の終わりではありません。 行 であり、改行ではこのループは終了しません。
コードは間違っていません[*] が、あなたが期待していることを行っていないだけです。入力の終わりまで読みますが、あなたは行の終わりまでしか読みたくないようです。
のどの戻り値とも異なっていなければならないので、EOF の値は -1 です。
getchar
の戻り値が実際の文字である場合とは異なるためです。ですから
getchar
は任意の文字値をunsigned charとして返し、intに変換されるため、負でない値になります。
ターミナルで入力しているときに、end-of-file を発生させたい場合は、CTRL-D (unix-style systems) または CTRL-Z (Windows) を使用します。そして、すべての入力が読み込まれた後に
getchar()
が返されます。
EOF
を返し、その結果
getchar() != EOF
は偽となり、ループは終了します。
[*] さて、入力がLONG_MAX文字以上の場合、整数のオーバーフローにより未定義の動作となりますが、簡単な例であれば許せるでしょう。
関連
-
C 構造体定義エラー: '['トークンの前に一次式があることが予想される
-
[C] レポートエラー 代入の左オペランドとしてlvalueが必要
-
#137: 式は変更可能なlvalueでなければならない問題 // 文字列配列の代入問題
-
error: 'for' loop initial declaration is only allowed in C99 mode 原因と解決方法
-
[解決済み] mallocとcallocの違い?
-
[解決済み] Project Eulerとの速度比較。CとPythonとErlangとHaskellの比較
-
[解決済み] while ( !feof (file) ) 」は、なぜいつも間違っているのですか?
-
[解決済み] C言語のi++と++iに性能差はあるのでしょうか?
-
[解決済み] フリーは、どのように無料化を知っているのですか?
-
[解決済み] C言語プログラミング言語」の本には、なぜmallocをキャストしなければならないと書いてあるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
警告:符号付き整数式と符号なし整数式の比較 [-Wsign-compare]
-
警告: 'struct XXX' はパラメータリストの内部で宣言されています。
-
[解決済み] Valgrind が初期化されていないバイトについて警告する
-
[解決済み] munmap_chunk(): 無効なポインタ
-
[解決済み] C言語の書式指定子 %ul と %lu の違いは何ですか?
-
[解決済み] C言語のコードで「:-!」とは何ですか?
-
[解決済み] C言語における「static」の意味とは?
-
[解決済み] Cプリプロセッサはなぜ "linux "という単語を定数 "1 "と解釈するのですか?
-
[解決済み] 講師が書いたC言語のファイルは、なぜ最初の行に#が一つ付いているのですか?
-
[解決済み] LD_PRELOADのトリックとは何ですか?