0

私はプログラミングが初めてで、コードで次のことが起こる理由を理解できないようです。

#include <stdio.h>

/*copy input to output; 1st version */

main()
{
    int c;

c = getchar();
while (c != EOF) {
    putchar(c);
    c = getchar();
    }
}

それで、いくつかの読書をした後、私は以下を集めました:

  1. getchar()保持機能であるため、Enter キーを押すまで何も実行されません。
  2. Enterキーを押す前に、すべてのキーストロークがバッファに保存されます
  3. getchar()呼び出されると、バッファ内の最初の値を参照し、その値になり、その値をバッファから削除します。

私の質問は、最初のコードを削除するとc = getchar()、結果のコードが元のコードとまったく同じ機能を持つということです。なぜこれが起こるのですか?putchar(c)コードを保持せず、cまだ定義されていない を表示しようとするため、ランダムなシンボルが出力されるためですか? それが役立つ場合は、Code::Blocks を使用しています。

4

3 に答える 3

1

リストした関数は、入力したすべての文字を単純にエコーバックします。I/O が「バッファリング」されるのは事実です。このバッファリングを行っているのは、オペレーティング システムのキーボード入力ドライバです。押すキーをバッファリングしている間、各キーがエコーバックされます。改行を押すと、ドライバーはバッファーされた文字をプログラムに渡し、getcharそれらを確認します。

書かれているように、関数は正常に動作するはずです:

c = getchar();   // get (buffer) the first char

while (c != EOF) {  // while the user has not typed ^D (EOF)
    putchar(c);     // put the character retrieved
    c = getchar();  // get the next character
}

キーボード ドライバのバッファリングのため、改行を押すか ^D (EOF) で終了するたびにエコー バックするだけです。

スマイリー フェイスは、@YuHao が説明したことから来てgetcharいます。実行したものの最初の行が欠落している可能性があるため、putchar迷惑メールがエコーされます。おそらく 0 で、画面上ではスマイリーのように見えます。

于 2013-06-29T17:04:24.393 に答える
0

最初の を省略するgetchar()と、コードは次のようになります。

int c;
while (c != EOF) {
    putchar(c);
    c = getchar();
}

ここでcは初期化されていないため、最初に呼び出すとputchar(c)ガベージ値が出力され、そこにスマイリー フェイスが表示されます。

于 2013-06-29T16:55:54.223 に答える