• ベストアンサー

getchar関数について

 非常に初心者な質問なのですが、このようなCプログラムをみたことがあります。 #include <stdio.h> int main(void) { int c; while((c = getchar()) != EOF){ putchar(c); putchar(c); } return 0; } なのですが、このプログラムは、実行した状態で、「Hello」と入力して改行すると、「HHeelllloo」と表示されるのです。  そこで疑問なのですが、最初に宣言した変数は c だけなのに、どうして一気に「HHeelllloo」と表示できるのでしょうか?  個人的な予想をすると、最後に入力した「o」だけが表示されるような気がしてたまらないのですが・・・。    なぜなのか教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • brogie
  • ベストアンサー率33% (131/392)
回答No.3

キーボードから入力した文字はcue(queueキュー)という作業領域に入力されます。Enterキーが押されると、次の処理に移ります。 あなたのプログラムではgetchar()でつぎつぎにキューに読み込まれ(Hello\n) Enterキーが押されてから、 putchar(c); putchar(c); の処理をします。 このcには最初はHが入っていますから、当然HHと同じ文字が表示されます。 つぎのループではeが入っていますからeeと表示されます。 ・・・・・・ while((c = getchar()) != EOF){ この文により Enterキーが押されるまで繰り返します。 getchar()関数はキューから取り出す命令です。 キューの容量は128バイト?ですから、それ以上は入りません。 文字をつぎつぎと入力していくと、それ以上になるとピー、ピーとなり、それ以上は入力できません。Enterキーを押すと、キューの先頭から処理されます。 また、スタックという作業領域は最後に入力された文字から処理されることはよくご存知と思います。 これは最初の難関でしょうか? 頑張ってね!!

noname#129397
質問者

お礼

 なるほど!非常によくわかりました。どうもありがとうございます。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.4

改行が押されるまで、入力された文字コードはキー入力バッファに蓄えられているからです。 改行が押された時点で一気にループが回り始めます。getcharですから、バッファの先頭から1文字ずつ処理されます。 これらはCの機能ではなく、OS等の仕様ですから、OS毎に多少動作が異なると思います。

noname#129397
質問者

お礼

 OSの使用によって動作が異なるってちょっと複雑ですね。ありがとうございます。

すると、全ての回答が全文表示されます。
回答No.2

こんにちは。 while((c = getchar()) != EOF){ putchar(c); putchar(c); } の部分を簡単に説明すると、 while((c = getchar()) != EOF)は、 標準入力から入力された文字を1文字読み込み、EOFでなければ、 while()以降の{}を実行します。 putchar(c);で、cの内容を標準出力します。 cを2回出力すると、もう一度while((c = getchar()) != EOF)を実行し、 前回読みこんだ文字の次の文字を読みこみます。 後は同じ事の繰り返しです。

noname#129397
質問者

お礼

 構造は結構簡単なのですね。ありがとうございました。

すると、全ての回答が全文表示されます。
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

while((c = getchar()) != EOF){ /* 標準入力から、読み込めなくなるまでループ。 */ putchar(c); /* <= ここで、cを出力。 */ putchar(c); /* <= ここでも、cを出力。 */ } ループ内でputcharしているから、当然ではないかと。 ピンとこなかったら、gdbやVisual Studioのソースデバッガ等で、実行をトレースすると良いかと。

noname#129397
質問者

お礼

 どうもありがとうございます。

すると、全ての回答が全文表示されます。

関連するQ&A