5

C プログラミング言語の本から次のプログラムを実行しています。

#include <stdio.h>
main()
{
  int c;
  while((c=getchar()) != EOF)
    putchar(); 
}

または

#include<stdio.h>
int main(){
   int c = getchar();
   while(c != EOF){
      putchar(c);
      c = getchar();
   }
}

このプログラムを実行すると、説明のつかない動作が発生します。コマンドラインから次の順序で文字を入力すると{'h', 'e', 'l', 'l', 'o', '\n', '^D'}、次の応答が画面に出力されます:が入力されたhello\n、プログラムは入力されると終了^Dします。

ただし、シーケンスを次のように変更すると{'h', 'e', 'l', 'l', 'o', '^D'}、次の応答が画面に出力されます:helloが、プログラムは終了しません。入ったらやめるべきではありません^Dか?^Dプログラムを終了するには、もう一度入力する必要があります。^Dまたは、次のように入力した後にのみプログラムが終了します\n。いつ入力してもプログラムが終了しない理由がわかりません^D。何かご意見は?

UNIX システムで実行しています。

4

1 に答える 1

18

^D ('end-of-transmission') と入力すると、入力バッファがフラッシュされ、それまでに入力したすべての内容がプログラムに送信されます (実際には ^D 文字は送信されません)。改行文字を入力するのと似ていますが、この場合は改行文字自体も送信されます。プログラムは、ゼロ文字を読み取ると、その入力が閉じていると見なします。これは、改行の後に ^D を入力するか、^D を 2 つ続けて入力すると発生します。

于 2014-11-28T07:41:12.420 に答える