2

私はこのコードをテストしました:

  1 #include <stdio.h>
  2 
  3 main()
  4 {
  5     int c;
  6 
  7     while ((c = getchar()) != EOF) {
  8         putchar(c);
  9         printf("%d ", c);
 10     }
 11     printf("%d\n", c);
 12 }

質問:

文字列を入力してから「Enter」を入力すると、次のような結果が得られました。

asdf

a97 s115 d100 f102

文字行のすぐ後ろに EOF(ctrl+d) を追加すると、次のように、入力のすぐ後ろに結果が得られました。

asdfa97 s115 d100 f102

私の質問は、「入力」がコードの実行をトリガーしたかどうかです。EOF を入力したときに、結果を出力するために 'enter' が必要でなかったのはなぜですか? 実行を終了するために別の EOF が必要だったのはなぜですか?

どうもありがとう。

4

1 に答える 1

1

あなたの最初のケースでは、出力がそうではなかったと確信していますか:

asdf
a97 s115 d100 f102 
10 

つまり、入力行の次の行には、 、、、asdfおよび の出力文字と数字が続き、次に(改行文字もあるために) (改行文字の ASCII 値) が付いた別の行が続きます。'a''s''d''f'putchar()10

プログラムはこの時点でも終了しないことに注意してください。まだ次の入力を待っています。

^D もEOF の「文字」を入力していません。端末プログラムに信号を送信しているだけです。あなたの場合、それは「フラッシュバッファ」を意味するように見えるので、プログラムはターミナルのラインバッファリングされた の入力にアクセスできます"asdf"。プログラムは改行を出力しないため、同じ行に出力が得られます。

^D 単独で行に入力すると、端末がプログラムへの接続を閉じ、実際の接続が行われ、プログラムEOFが終了します。

例 - 入力「asdf\n」:

# ./example 
asdf
a97 s115 d100 f102 
10

例 - 入力 "asdf^D":

$ ./example 
asdfa97 s115 d100 f102

例 - 入力 "asdf\n^D":

$ ./example 
asdf
a97 s115 d100 f102 
10 -1
于 2014-06-26T23:37:33.590 に答える