2012-03-09 10 views
0

次の単純なCコードをコンパイルして正常に動作しています。しかし、それは私が理解していない方法で動作します。私は文字を入力し、それを画面に表示します。しかし私はリターンキーを押すと、行全体を印刷します。したがって、文字a、b、cを入力すると、コマンドラインにabcが2回印刷されます。それは何ですか?このCコードが予期しない動作をする理由

#include <stdio.h> 


int main(){ 


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

return 0; 

} 

答えて

4

あなたの端末であり、プログラムではありません。

キーを押すと、お使いの端末は、それを印刷しますが、プログラムに渡していません。

Enterキーを押すと、端末はプログラムに全体のラインを通過して、プログラムが行を出力します。

EDIT:あなたはUNIX/Linuxのの/ etcを使用する場合は、その端末の動作を無効にするにはstty -icanon -echoを書くことができます。 -echoは印刷をオフにし、はバッファリングをオフにします。

5

あなたの端末は回線がバッファされているためです。

あなたは、彼らはあなたがヒットするキーイング見ることができますので、それが画面に文字をエコーし​​ますけれども、それは、改行に遭遇するまで、それはあなたのプログラムにデータを送信しません。

0

あなたが見ているのは、いくつかの組み合わせです。

  1. 文字を入力すると、明示的に停止しない限り、画面に印刷されます。
  2. ほとんどの印刷ステートメントは、新しい行が印刷されるまで実際に何も印刷されません。

あなたが見ているテキストはタイプコマンドから来ていますが、putchar()文字列がすべて同時に表示されています。

0

あなたはラインバッファリングされた標準入力ストリームから読み込んでいます。

は、この代替コードを試してみて、あなたは何が起こっているかをよりよく理解されます:

#include <stdio.h> 
int main(){ 
    int c; 
    while((c=getchar())!=EOF){ 
     printf("got char %c\n", c); 
    } 
    return 0; 
} 

あなたは非ラインバッファリングされた入力を必要としています。これはお使いのプラットフォームに依存しますが、ここではLinux上の答えです:non-buffering stdin reading

関連する問題