2012-03-20 15 views
2

基本的な質問ですが、質問しなければなりませんでした。このようなプログラムの場合、ユースケースが123^Zの場合、最後にEOFを置いても(Ctrl + Z)、プログラムは終了しません。どうしてこんなことに?それは、それが動作するCRの後にEOFを置くときだけです。どのようなanwersが評価されます。ありがとう。Cの入力 - getchar()

#include < stdio.h> 

void main() 
{ 
    int i, nc; 

    nc = 0; 
    i = getchar(); 
    while (i != EOF) { 
     nc = nc + 1; 
     i = getchar(); 
    } 
    printf("Number of characters in file = %d\n", nc); 
} 
+1

どのプラットフォームですか? '^ Z'はWindowsと思うが、あなたのプラットフォームで質問にタグを付けるといいだろう。ありがとう。 – sarnold

+0

ええ、窓.. – Iceman

+0

EOFの後にCRを置くとどうなりますか? – asaelr

答えて

6

Windowsでは、Ctrl-Zショートカットは、行の先頭で押された場合にのみ有効です。それ以外の場合、OSはそれを無視します。最初に改行文字を挿入するには、 "Enter"または "return"を押す必要があります。

Unixでは、Ctrlキーを押しながらDのショートカットは、(下記のコメントで述べたように)すぐにstdinをフラッシュしますが、新しい、空白行にある場合を除きEOFを返すようにgetchar()が発生することはありません。 Windowsと同じです。 (下記)のコメントから

のUnixには "EOF文字は" ありません。 EOFは単に長さゼロの読み取りです。これは普通のファイルの最後で起こり、EOF(通常は^ D)の端末設定で設定されている制御文字を押すことで強制的に端末に送られます。ターミナルバッファが空でないときに^ Dが機能しないのは、実際に何かをストリームに挿入しないということです。それは保留中の読み込みを返すだけですが、入力の長さがゼロでないため、アプリケーションによって "EOF"として扱われません。

これは良い点を解決する - 何のファイルは実際EOFが含まれていない - と(私が以前言っていた通り)にCtrl-Dはstdinストリームに何かを「挿入」しません押します。それはちょうどフラッシュstdinをフラッシュします。 EOFは、標準機能によってファイルの終わりに達したという通知を表す標準マクロです。

@Rに感謝します。 EOFの説明のために。

+1

あまりありません。 '^ D'は、STDINを一掃するために行内で動作しますが、すぐにSTDINを閉じる*ではありません。 –

+0

私のシステム(Debian、Unixではないことは間違いない)は、あなたのように振る舞いません。行の途中でCtrl + Dキーを押すと、入力せずにenterキーを押すと明らかな効果があります。 – pmg

+0

コメントありがとう、Niklas。それに応じて私の答えを更新しました。 –