2013-07-09 1 views
6

を機能:GETCHARの背後にある理論()とのputchar()、私は私を困惑しているK & Rおよび例1.5による "プログラミング言語C" を通じて働いている

#include <stdio.h> 

/* copy input to output; 1st version */ 
int main(int argc, char *argv[]) 
{ 
    int c; 

    while ((c = getchar()) != EOF) 
     putchar(c); 

    return 0; 
} 

を私がいることを理解 'getchar関数()' 'putchar()'の文字を表示します。しかし、ターミナルでプログラムを実行すると、なぜputchar()が表示されるために文字列全体を渡すことができるのですか?

+0

そのシンプルな、重複する必要があります、とにかく答えを見てください:) – 0decimal0

答えて

20

端末が回線でバッファされているためです。 getchar()putchar()は1文字でしか動作しませんが、端末は行全体を入力するまでプログラムに文字を送信するのを待っています。その後、getchar()はそのバッファから文字を1つずつ取得し、putchar()はそれらを1つずつ表示します。

追加::端末がラインバッファリングされているということは、改行文字に遭遇したときに入力をプログラムに提出することを意味します。通常、一度に1文字の代わりにデータのブロックを提出する方が効率的です。また、Enterキーを押す前に、行を編集する機会もユーザーに提供します。

:ラインバッファリングがcanonical mode for the terminalを無効にしstdinNULLsetbufを呼び出すことによってオフにすることができます。

+0

これは理にかなっています。ありがとう!説明のために – Raeven

+0

+1。しかし、あなたはこの行についてもっと詳しく説明できますか? - 「あなたの端末はラインバッファリングされているので」? –

+0

+1 from me too :) – 0decimal0

2

ええ実際には、EOFの文字ではなく、キーボードは特別な入出力デバイスで、それは直接BIOSで動作し、キーボードに入力された文字はバッファに直接挿入されますこのバッファは、バッファにデータをプッシュしている文を入力するときにプリミティブgetchar()によって読み取られ、getchar()関数は無限ループに入っています。これがこの理由です。

IOデバイスの動作の詳細については、私に質問できます。

乾杯。

+0

ありがとうございます! – Raeven

+0

少なくともCP/M時代からは、「EOFキャラクター」のようなものはありません。 Cの 'EOF'は、入力ストリームが終了したときに' getchar() 'によって返される特別な値です。文字としてではなく、エラーコードと考えることができます。 –

+0

あなたは大歓迎ですRaeven –

関連する問題