2

私は Kernighan と Ritchie による C プログラミング言語を読んでいて、非常に早い段階で、本から直接コピーしたにもかかわらず、機能しないプログラムに出くわしました。これが説明のスクリーン キャップです - http://i.imgur.com/SBQSE.png

私が入力したものは明らかにキーボード入力であり、明らかにキーボード入力ではない EOF に対してチェックインしているため、無限ループに陥ります。

#include <stdio.h> 
/* copy input to output; 1st version  */ 
main() 
{ 
    int c; 
    c = getchar(); 
    while (c != EOF) { 
        putchar(c); 
        c = getchar(); 
    } 
}

確かに、このような C の権威本に誤りがあるはずはありません。

4

2 に答える 2

4

これを実行してctrl + d、コマンド ラインから読み取るときに EOF (ファイルの終わり) を通知するために使用します。

ファイルからバイトのストリームを読み取っていた場合、それは自動的にそこに含まれます。ただし、コマンド ラインから読み取りを行っているため、上記のキー シーケンスを使用してファイルの終わりを手動で通知する必要があります。

実際の仕組み

EOF は通常、(少なくとも glibc では) -1 を表します。そのwhile(c) { do work; }ため、0 以外の値が true であるため、単に言うことはできませんgetchar()c != EOFこれが、 で EOF シグナルを送信したときにc が EOF (-1) と一致するかどうかを直接確認する必要がある理由ですctrl + d

于 2012-09-02T20:41:23.937 に答える
2

EOF はエンドオブファイルです。Ctrl-D を試してください。

于 2012-09-02T20:40:21.457 に答える