7

次のコードが入力の文字数を出力しない理由がわかりませんか? これはK&Rの本からそのまま引用しました。現時点で C を学んでいて、これは本当に混乱しています。私には、決して EOF に達していないように見えます。もしそうなら、なぜこれが例として使われるのでしょうか?

#include <stdio.h>

main()
{
    double nc;

    for (nc = 0; getchar() != EOF; ++nc)
        ;
    printf("%d\n", nc);
}
4

6 に答える 6

12

プログラムは正しいように見えますが、問題はEOF、標準入力がファイルとして扱われるため、入力後にコマンドラインに (ファイルの終わり) を送信する必要があることです。Linux 端末では Ctrl+D を押して送信できると思いますEOF... 他の OS でそれを行う方法がわかりません。このプログラムをテストするには、Enter キーを押したときにプログラムが停止するように変更EOFすることをお勧めします。'\n'

于 2008-12-05T01:26:38.097 に答える
7

プログラムは、 が受信されるstdinまでデータを読み取り続けますEOF。これは、Unix コンソールの行の先頭で Ctrl-D を押すか、Windows コンソールの行の先頭で Ctrl-Z を押すことによって行われます。EOFこの方法で信号を送った後printf、読み取った文字数を表示する関数が実行されます。

于 2008-12-05T01:25:53.200 に答える
6

Your ncis a double — doubleprintf("%lf", nc)を出力するために使用します。

代わりにこれを試してください

#include <stdio.h>

int main(void)
{
    int nc;

    for (nc = 0; getchar() != EOF; ++nc)
        ;
    printf("%d\n", nc);

    return 0;
}
于 2008-12-05T01:39:20.973 に答える
5

「EOFを送信する」、「EOFを受信した」、「EOF文字」などのフレーズを使用しているように見えるため、これまでの回答を明確にしたいと思います。この回答に対するコメント(感謝)によると、「EOFを送信する」と「EOFを受け取った」というのは正当な用語ですが、文字だとは思わないでください。

EOF は文字ではありません。これは、ストリームが「ファイルの終わり」にある場合、または読み取りエラーが発生した場合に getchar() (または fgetc/getc) が返す値です。これは、getchar() が返す文字値の範囲外の特別な値であり、エラーまたはファイルの終わりの状態を示します。

C 標準では負として定義されていますが、getchar は int に変換された unsigned char として文字を返します。

編集:ここに書いた段落の前に行うべきだった調査を行ったところ、私の仮定のいくつかが完全に間違っていたことに気付きました。これを指摘してくれたコメンターに感謝します。

ストリーム (stdin など) がファイルの終わりの状態になると、この状態は clearerr() で再びクリアでき、getchar() は stdin からさらにデータを読み取ることができます。

于 2008-12-05T02:46:40.853 に答える
1

このコードは、標準入力から文字を読み取ります。このプログラムを正常に実行すると、標準入力はユーザーから取得されます。この場合、EOF をプログラムに送信する方法はありません。

このコードは、(./myprogram < tempfile.txt) でファイルを標準にリダイレクトすると機能します。

于 2008-12-05T01:24:46.650 に答える
0

まず、前述のように、double を表示するには %d ではなく %lf が必要です。そうしないと、常にゼロが表示されます (d は符号付き整数を表します)。次に、これを Windows ベースの OS タイプでいくつかの文字で手動でテストする場合は、Enter キーを押してから、次の行で単独で CtrlZ キーを押します (これにより、EOF がシミュレートされます)。印刷結果は、文字数よりも 1 つ多くなります (CtrlZ を含みます)。また、SoapBoxがEOFを探すときに示したように、当時の考え方は、標準入力を介してファイルをプログラムにパイプするUnixでした。これも機能します。

于 2008-12-05T06:55:09.277 に答える