6

私はK&Rで自分自身にCを教えていますが、本の例の1つに困惑しています。例に書かれているとおりにコードをコンパイルしますが、作成者の言うとおりには実行されません。プログラムは文字を数えることになっています。与えられたコードは次のとおりです。

#include <stdio.h>

/* count characters in input; 1st version */
main()
{
    long nc;
    nc=0;
    while (getchar() != EOF)
     ++nc;
    printf("%ld\n", nc);
}

コンパイルするには、main()をint main()に置き換えます。しかし、私はそれが質問に関連していないと思います。プログラムはコンパイルされ、正常に実行されます。しかし、それは単にそれがするように書かれたように文字を数えません。私は何かが足りないのですか?本が書かれてから、現代​​のコンパイラがこのようなコード例を扱う方法に何か変更があったでしょうか?この掲示板の善良な人々が提供できるかもしれないどんな援助も大いに感謝されるでしょう。

最高、ダン

4

4 に答える 4

10

他の答えは技術的には正しいですが、この例(1.5.2)と次の例(1.5.3)は教育的に混乱しているように感じます。「文字数1.5.2」をグーグルで検索すると、OPと同じように、この例に巻き込まれた他の多くの人を見つけることができます。非常に紛らわしいのは、インタラクティブモードでEOF文字を生成する方法についての説明がテキストになく、前の例では「return」が入力されるとすぐに結果が出力されたためです。したがって、Cの初心者は、1.5.3のプログラムでも同じことを行う必要があると想定します...

期待される結果を生み出す次の代替コードを提案したいと思います。

#include <stdio.h>
#define     EOL '\n'

main()
{
    long nc;
    int c;
    nc = 0;

    while ((c = getchar()) != EOF)
    {
        ++nc;
        if (c == EOL)
        {
            /* Print number of input characters (not including return character) */
            printf("%ld\n", nc-1); 
            nc = 0;
        }
    }
}

本文でまだ説明されていないCの唯一の要素はifステートメントです。これは、次のセクション(1.5.3)で実際に説明されています。この小さな代替の例が、K&Rの本の元の例に巻き込まれた他の人の助けになることを願っています。良い「演習1.7b」は、2つのバージョンの違いを調べて、それらが同じ結果を出力することを確認することを説明することです(他の回答についてCtrlD/CtrlZ から読んだ後)。

于 2013-06-19T08:58:23.507 に答える
7

プログラムは、「ファイルの終わり」を読み取った後にのみ文字数を出力します。インタラクティブな入力を使用すると、ctrl + dを介して「ファイルの終わり」を生成できます(少なくとも* NIXでは、ウィンドウについてはわかりません)。これを知っていると、プログラムはここで正しく動作します。

于 2010-09-05T14:01:36.243 に答える
5

mainの戻り値は別として、問題ないように見えます。

キーボードから値を入力する場合、入力の最後にCtrlD(Unix)または(Windows)を実行しますか?CtrlZ

于 2010-09-05T14:00:39.030 に答える
0

Ctrl + z(コンソールでは^ Zとして表示されます)は、コンソール入力のどこにも単純に入力できないことにも注意してください。文字列/テキスト/文字の最終行の最初の入力として入力する必要があります。例えば

初期入力の画像Ctrl+z

この例でわかるように、ランダムなテキストを入力し、各行が終了した後、Enterキーを押しました。今これは重要です!!! 最後の行でEnterキーを押すと、EOF(End-of-File)が呼び出され、残りのコードが本来の意図どおりに実行されます。

完全に実行されたコード

ノート:

  • Ctrl +zは^Zとして表示されますが、何度押してもプログラムでは文字としてカウントされません。
  • また、ctrl+z以降の文字はカウントされません。
  • Enterはこのプログラムによってカウントされます

ソース:WindowsコマンドプロンプトのEOFが入力ストリームを終了しない

于 2017-07-23T19:23:08.133 に答える