6

この例はK&Rの本からのものです

#include<stdio.h>


main()
{
    long nc;

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

ここに画像の説明を入力してください

なぜそのように機能するのか説明していただけますか。ありがとう。

^ Z ^ Zも機能しません(行の先頭にない限り)

ここに画像の説明を入力してください

4

4 に答える 4

1

tty文字の従来のUNIXの解釈は、クックされたttyラインバッファ内にバッファリングされているものをすべて読み取った後EOF、ブロッキングを返すことです。read新しい行の先頭では、read0を返す(ゼロバイトを読み取る)ことを意味します。ちなみに、0サイズreadは、通常のファイルのファイルの終わりの状態を検出する方法です。

そのため、行の途中の最初 の行は、Cランタイムライブラリにファイルの終わりを検出させずEOFに、行の先頭を強制します。2番目の文字は空のバッファをアプリケーションによって強制的に実行するため、2つの文字が連続して0サイズの読み取りを生成します。read EOFread

$ cat
foo[press ^D]foo <=== after ^D, input printed back before EOL, despite cooked mode. No EOF detected
foo[press ^D]foo[press ^D] <=== after first ^D, input printed back, and on second ^D, cat detects EOF

$ cat
Some first line<CR> <=== input
Some first line <=== the line is read and printed
[press ^D] <=== at line start, ^D forces 0-sized read to happen, cat detects EOF

Cランタイムライブラリは上記のセマンティクスを模倣していると思います(Windowsでは、システムコールはもちろん、コール^Zレベルでの特別な処理はありません)。そのため、入力行の途中でもkernel32EOFを検出する可能性があります。^Z^Z

于 2013-01-21T11:00:17.027 に答える
0

たまたまあなたと同じ質問がありました。関数を終了したい場合はgetchar()、2を入力するEOFか、<ENTER>プラスaを入力する必要がありEOFます。

そして、これが私がこの質問について検索したより簡単な答えです:

ターミナルに登場するキャラクターがいる場合、EOFはこの入場を阻止する役割を果たし、新たな入場ターンを引き起こします。一方、入力が発生していない場合、つまりgetchar()が新しい入力を待機している場合(入力が終了したばかりやEOFなど)、入力しようとしているEOFは「end」になります。 of file」。これにより、プログラムは関数getchar()の実行を停止します。

PS:質問はあなたが使用しているときに起こりますgetchar()。この答えは理解しやすいと思いますが、中国語から翻訳されているので、おそらくあなたには向いていません...

于 2013-01-25T09:00:45.447 に答える
0

プログラムはEOF、入力の実際の最後でのみ読み取ります。端末/OS/ファイルが行の先頭でのみ終了することを許可している場合は、そこにファイルがあります。これは、データが一度に1回線しか送信されなかった昔ながらの端末への逆戻りだと思います(私が知っている限りでは、パンチカードリーダーに戻ります)。

EOF正中線で事前に準備したファイルからデータを読み取ってみてください。一部の編集者がこれを困難にしていることに気付くかもしれません!プログラムはそれを入力として正常に動作するはずです。

于 2013-01-21T13:25:09.923 に答える
0

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

オペレーティングシステムによっては、EOF文字は行の最初の文字、つまり。の後の最初の文字である場合にのみ機能しEnterます。コンソール入力は多くの場合行指向であるため、システムは、EOFフォローアップするまで文字を認識しない場合がありますEnter

于 2013-01-21T13:57:52.947 に答える