1

私はPrenticeHallを読んでいます。Cプログラミング言語-2ndEd.Kernighan、Ritchie。

この本(pg-20)には、ユーザーがコンソールウィンドウに入力した文字数を出力するプログラムの例が示されています。そのコードは次のとおりです。

#include <stdio.h>

main()
{
    double nc;
    for (nc = 0; getchar() != EOF; ++nc)
        ;

    printf("%.0f\n", nc);
}

しかし、これを実行してコンソールに何かを入力すると、何も印刷されず、カーソルが点滅し続けます。そしてこれはまさにその本にコードが書かれている方法です。

別の方法でも試しましたが、これもうまくいきませんでした。前のコードと同じ結果です。

#include <stdio.h>

main()
{
    long nc;
    nc = 0;
    while (getchar() != EOF)
            ++nc;

    printf("%ld\n", nc);
}

これを機能させる方法について何かアイデアはありますか?

PS私はWindowsOSを使用しています。(まだ)

4

4 に答える 4

6

その理由は、コードがファイルの終わりまですべての入力を読み取ろうとするためです。このプログラムがファイルから読み取っていた場合、いつ終了したかはわかりますが、コンソールから読み取っているため、入力が終了したことを明示的に通知する必要があります。Linuxでは^D(Ctrl + D)を押し、Windowsでは^Z(Ctrl + Z)を押してこれを行います。

新しい行の先頭で実行する必要があることに注意してください。つまり、を押した後、 (Winで)Enterを押します。^D^Z

私はPrenticeHallを読んでいます。Ansi Cプログラミング言語-2ndEd.Kernighan、Ritchie。

それはあなたが読んでいるとても良い本です。それはとても良いことだと思います、それはあなたの質問への答えを含んでいます。

于 2012-06-22T11:54:49.240 に答える
5

どちらのプログラムも機能しEOFます。質問の下の最初のコメントで示したように、入力する必要があります。つまり^D、Linuxでは(Control-D)^Z、Windowsでは(Control-Z)です。

ループ内の両方の条件が、終了する入力を探してEOFいないか、他の入力を探していることに注意してください。この入力を入力すると、ループが終了し、カウントが表示されます。

于 2012-06-22T11:55:13.473 に答える
3

入力テーピングの「EOF」文字を停止する必要があります(GNU/LinuxではCtrl+D)。

于 2012-06-22T11:57:04.583 に答える
2

私のコンパイラー(GCC 4.4)は、あなたが投稿したコードをいじくり回します。これにより、混乱がなくなります。

#include <stdio.h>

int main()
{
    int nc;
    for (nc = 0; getchar() != EOF; ++nc)
        ;
    printf("%d\n", nc);
    return 0;
}

ただし、他の答えは正しいです。キーボード入力をCtrl-Dまたは-Zで終了する必要があります。

ちなみに、カーニハンとリッチーがdoubleこの文脈でを使用した理由はわかりません。

于 2012-06-22T12:00:01.480 に答える