0

以下の簡単な C コードを書きましたが、コンパイルして問題なく動作します。しかし、それは私が理解できない方法で動作します。文字を入力すると、画面に表示されます。しかし、リターンキーを押すと、行全体が出力されます。したがって、a、b、c の文字を入力すると、abc がコマンド ラインに 2 回出力されます。なぜこれを行うのですか?

#include <stdio.h>


int main(){


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

return 0;

}
4

4 に答える 4

5

端末がラインバッファリングされているためです。

改行に遭遇するまでプログラムにデータを送信しませんが、ヒットしたキーを確認できるように文字を画面にエコーします。

于 2012-03-09T14:44:33.710 に答える
4

プログラムではなく、端末です。

キーを押すと、端末はそれを出力しますが、プログラムには渡しません。

Enter キーを押すと、端末は行全体をプログラムに渡し、プログラムはその行を出力します。

編集: Unix/Linux/etc を使用している場合は、stty -icanon -echoその端末の動作を無効にするように書き込むことができます。は-echo印刷を-icanonオフにし、 はバッファリングをオフにします。

于 2012-03-09T14:44:33.917 に答える
0

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

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

したがって、表示されているテキストは type コマンドからのものですが、出力される putchar() 文字列は一度に発生しています。

于 2012-03-09T14:45:26.587 に答える
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

于 2012-03-09T14:48:20.797 に答える