2012-08-14 14 views
7

ここに私のコードです。私は端末でubuntuで実行します。ターミナルで(CtrlD)を入力すると、プログラムは停止せずに入力を待っていました。ctrl-dはwhile(getchar()!= EOF)ループを停止しませんでした

CtrlDはUNIXのEOFと同じですか?

ありがとうございます。

#include<stdio.h> 

main() { 
    int d; 
    while(d=getchar()!=EOF) { 
     printf("\"getchar()!=EOF\" result is %d\n", d); 
     printf("EOF:%d\n", EOF); 
    } 
     printf("\"getchar()!=EOF\" result is %d\n", d); 
} 
+1

これは再帰ではありません。あなたが入力をEOLするまでは無限ループです。再帰=直接関数を呼び出したり、他の中間ステップ数を呼び出した関数。 –

+0

gccで '^ D 'を押すとループが止められました。 –

+0

@JonLin^Dを入力するだけで、私にとってもうまくいきます。しかし、入力が(a^D)の場合、ループは停止しませんでした。 – Sam

答えて

11

EOFは文字ではありません。 EOFは、入力の最後に達したとき、または何らかのエラーが発生したときに、getchar()が返すマクロです。 ^Dは "EOF文字"ではありません。 linuxの下で何が起こっているのかは、^ Dを押すとストリームが閉じ、getchar()コールが入力の最後に達し、EOFマクロが返されます。行の途中に^Dと入力すると、ストリームは閉じられないため、getchar()は読み取った値を返し、ループは終了しません。

詳細については、stdio section of the C faqを参照してください。

さらに:現代のシステムで

、それがファイルに保存されている実際のファイル終了文字を反映していません。それ以上の文字が利用できないという信号です。

+0

私は慎重にウェブサイトを読んでいます。私の意見では、行の途中で '^ D 'と入力すると、bashは'^D'に取り組まれます。その結果、Cプログラムはストリームを閉じるコマンドを取得しませんでした。 '^ D 'を1行に入力すると、Cプログラムは正しいコマンドを取得します。私は正しい? – Sam

+1

@qingfeng '^ D 'についてもう少し詳しくはこちら:http://www.c-faq.com/stdio/eofval.htmlしかし、ええ、ストリームは単独で行かないと閉じられません。ここでの簡単な説明:http://stackoverflow.com/a/1516177/851273 –

+6

端末が標準モードにあるとき、あなたがenterを押すまで、ttyデバイス上に回線は送信されません。設定されたEOFキー(デフォルトでは^ D)を押すと、データがすぐに送信され、利用可能な文字数で返されるのを待つ 'read'が発生します。その行にすでにデータがある場合、これは長さがゼロでない通常の読み込みになります。行が空の場合は、長さ0の読み込みが行われます。これは、ファイルディスクリプタのファイル終了ステータスの*定義*です。したがって、stdio層はそれをEOF状態として解釈します。 –

6

EOFについてのJon Linの回答に加えて、あなたが書いたコードがあなたが意図したコードであるかどうかはわかりません。あなたは、変数dgetcharから返された値を表示したい場合は、あなたがあなたのwhile文を変更する必要があります:不等価演算子は、割り当てよりも優先順位が高いので

while((d=getchar())!=EOF) { 

です。だから、あなたのコードでdは常に0または1のいずれかになります。

+0

あなたは非常に細心の注意を払っています。しかし、 'd = getchar()!= EOF'の式が0か1であることを確認したいだけです。 – Sam

+0

@Sam:比較の結果を書き出すことで、' while((d =(getchar()!= EOF))!= 0) 'または' while((d =(getchar()!= EOF)))) ')を実行します。もっと一般的な方法は 'get(get = getchar())!= EOF)'です。これは 'getchar()'の結果を 'd'に代入し、それをEOFと比較します。それはコンパイラの警告を避けるためです。現代のコンパイラの多くは、あなたが書いたことの警告を生成します。 –

関連する問題