0

私は最近 C プログラミング言語を購入し、テキストをゆっくりと読んで、すべてを理解していることを確認しています。この配列の例 (第 1.6 章) に出くわしましたが、スタック オーバーフローで既に多くの質問に回答されているおかげで完全に理解できました。

問題は、プログラムを実行しても何も出力されないことです。この本は時々頭が悪いと感じさせる癖があるので、これが初心者の質問である場合は事前にお詫び申し上げます. 私はかなり長い間答えを探していたことを保証します。

これはテキストのコードです。私はXCode 4を使用しています:

#include <stdio.h>
/* count digits, white space, others */
main()
{
    int c, i, nwhite, nother;
    int ndigit[10];
    nwhite = nother = 0;

    for (i = 0; i < 10; ++i)
        ndigit[i] = 0;

    while ((c = getchar()) != EOF)
        if (c >= '0' && c <= '9')
            ++ndigit[c-'0'];
        else if (c == ' ' || c == '\n' || c == '\t')
            ++nwhite;
        else
            ++nother;

    printf("digits =");

    for (i = 0; i < 10; ++i)
        printf(" %d", ndigit[i]);

    printf(", white space = %d, other = %d\n", nwhite, nother);
}

なぜ実行されないのですか??

4

2 に答える 2

3

この行:

    while ((c = getchar()) != EOF)

条件を false にするために必要な文字を読み取るwhileまで、ループが継続することを保証します。getchar()したがって、端末にEOF文字を入力するまで、文字は続行されます-これを行うには、キーの組み合わせCtrl+を使用する必要がありますD

于 2012-07-05T22:46:18.743 に答える
3

あなたのバージョンと本のバージョンの間に矛盾は見当たりませんでした。問題はおそらくプログラムの実行方法にあると思います。

getchar()標準入力から文字を読み取ります。これは、端末デバイス、別のプログラムへのパイプ、またはネットワーク ソケット (まれ) である可能性があります。

このプログラムを実行すると、いくつかの文字を入力してから入力を終了するまで、おそらくそこに留まります。ほとんどの端末では、新しい行に Control+D 文字を入力すると終了します。

簡単に再現可能なメカニズムを介してプログラムに入力を与える方が簡単です-ファイルまたは内容を介してパイプしますecho

./a.out < /etc/passwd
echo "hello world" | ./a.out

の代わりに任意のプログラムを使用できますecho-- 次のものも使用できますls(1)

ls | ./a.out

悲しいことに、K&R の本は多くの点で優れていますが、開発環境と実行環境についてはほとんど無視されています。C は非常に膨大な数のマシンを対象としているため、仕様に階層的なディレクトリ構造が含まれていません。簡単な例を 1 つ挙げます。

于 2012-07-05T22:47:19.590 に答える