質問

例では:

#include <stdio.h>

main()
{
    long nc;

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

よくわかりません。putchar() は文字を出力しますが、EOF の後にすべての文字を出力するのはなぜですか。これらすべての文字はどこで記憶されているのでしょうか?ありがとう。

役に立ちましたか?

解決

これは、バッファリングののと呼ばれています、それはオペレーティングシステムによって行われます。通常、それはちょうどあなたがメモリにそれを置くすべての文字を保存し、それが改行に遭遇したファイルにすべてを書き込み行バッファリングを行います。ファイル操作が他の操作よりもはるかに多くの時間がかかるので、これは、リソースを節約できます。だからではなく、一つ一つの文字で出力を行うのではなく、バッファ内に収集する文字の束を待って、一度にすべてからそれらを書き込みます。

これはOSによって行わだけ巧妙な策略だあなたは、プログラマが、心配する必要はありませんことを。ちょうどそれ一つ一つであなたの文字を投げると、OSが独自の方法で残りの部分を処理してみましょう。

他のヒント

[のこれが答えではありませんが、コメント内のコードを置くことができない

私はあなたがこのような何かを意味だと思います:

#include <stdio.h>

main()
{
    long nc;
    nc = 0;
    char c;
    while ((c = getchar()) != EOF)
    {
       putchar(c); /* prints one char */
        ++nc;
    }
    printf("%ld\n", nc); /* prints the number of characters read */
}

ノーところ、このコードは、フラッシュの前に残っていたどのように多くの文字を入力し、書き込みを空にします。

このは必ず入力ファイル(標準入力)

に残っていない文字ではないということになることです

コードを確認してみましょう。

#include <stdio.h>

ここまでは順調ですね...

main()
{
  1. main() 関数は常にanを返します int. 。いつも。
  2. リターンタイプのない関数を宣言する機能は、デフォルトであるため、フォームが悪いですint, 、しかし、コードを読むとき、人々はこれを簡単に覚えていません。

次に進みます...

long nc;

nc = 0;

良いフォーム。変数は使用前に初期化されます。

while (getchar() != EOF)
    ++nc;

これは少し複雑です。しかし、一度に一歩ずつ。

  1. getchar 関数は次の値を返しますint 標準入力から。
  2. その値は次に比較されますEOF.
  3. もし int 標準入力からの値はそうではありません EOF, 、変数nc が増加します。

したがって、終了するには while ループの場合、標準入力から EOF を生成する必要があります。

注記: 標準入力から読み取られた値はどれも 保存されました. 。式が評価された後、各値は破棄されます。

スタイル:それぞれの後に「{」と「}」を使用することをお勧めします while 声明。これは 安全 身につけてしまう習慣。

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

上記のステートメントは、次の値を出力 (表示) しています。 nc. 。の値 nc 標準入力から読み取られた文字数を表します。このステートメントは次のことを行います ない 標準入力からの任意の文字を表示します。

}

最後に、 main プログラムはオペレーティング システムに値を返す必要があります。移植可能な 2 つの値は次のとおりです。 EXIT_SUCCESS そして EXIT_FAILURE, で定義されています。 stdlib.h. 。これらの値のいずれかを指定することも良い習慣となります。

ところで、ありません putchar あなたが投稿した例(私はこの回答にコピーしました)。

それが入るとなると、

のputcharバッファに文字を入れて、それが画面にライン・ワード出力をもたらすでしょう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top