2009-11-24 9 views
15

私はPellesCを使用して実行中のコードの小さなスニペットを持っています。getchar()がコンソール上でEOFとしてリターンを認識しないのはなぜですか?

コードが実行され、コンソールにいくつかの文字が入力されたら、Enterキーを押します。

printf("%ld\n", nc);行が実行されていないように私に説明することはできますか?コンソールに出力が書き込まれないため。

#include <stdio.h> 

int main(void) 
{ 
    long nc = 0; 

    while(getchar() != EOF) 
    { 
     ++nc; 
    } 

    printf("%ld\n", nc); 
} 

私はK & R帳を使って徹底的にCを学ぶことにしましたし、私はこのかなり基本的な例が、私は困惑していると言って恥ずかしいです。

答えて

33

Enterキーを押しても実際にはEOF( "ファイルの終わり")は発生しません。あなたは入力を提供することで完全に終わったことを伝える必要があります。 Unixでは、通常を入力してください。です。 Windowsでは私はそれがのCtrlのZとそれに続くと信じていますが、私は本当にそれについては分かりません。

+1

私は本当にWindowsを使用しており、Ctrl + Zは正しいです。ありがとう、私はそれを新しいことはありません。 –

+0

it ** is ** ctrl + z –

4

どのように入力を終了し、どのシステムを使用していますか?

「割り込み」または「強制終了」コントロールキーの組み合わせを使用している場合、印刷する前にプロセスを強制終了している可能性があります。

Windowsの行頭でUnixやCtrl-ZのようにCtrl-Dを使用すると、プロセスを強制終了せずに「入力の終わり」を知らせます。

また、入力をテストファイルからリダイレクトすることもできます。例:

myprogram <input.txt 
1

「Enter」と入力しますか?コード内のサイクルは、ファイルの終わりのマーカーに達するまで反復し続けます。 「Enterを押す」はEOFにはなりません。キーボードからEOFをシミュレートする場合は、端末のマニュアルを参照してください。たとえば、Windowsでは、EOFを生成するためにCtrl + Zを押す必要があります。

0

getchar()は標準入力(通常はキーボード)から値を返します。私はEOFがどんなキャラクターにマップされるのか覚えていませんが、おそらくタイプすることはできません。

+1

EOFはどの文字にもマッピングされません。 EOFは負の値を持ち、 'getchar()'は 'stdin'ストリームの次の文字の値を' unsigned char'にキャストします。正の値...またはEOF – pmg

+0

** getchar(3)* *は 'int'関数で、ファイルの終わりを知らせるために' EOF'(通常は-1)を返します。 'EOF'は文字ではないので、' getchar() 'が' char'の代わりに 'int'を返す理由です。 –

4

Windowsでは、CTRL-ZまたはF6のいずれかでファイルの終わりを知らせます。

2

ENTERはコードとして'\n'と書かれています。ファイルの終わりに達したときにのみ、行の終わりない、ストリームからEOFを取得します。この

#include <stdio.h> 

int main(void) 
{ 
    long nc = 0; 

    /* count chars, except for ENTER */ 
    while(getchar() != '\n') 
    { 
     ++nc; 
    } 

    printf("%ld\n", nc); 
    return 0; 
} 
18

を試してみてください。ファイルの終わりを知らせる方法は、OSと端末の設定によって異なります。

これは、Windows上のUNIXタイプのシステム上のDCTRLZ通常CTRLです。 UNIXのcookedモード(通常の入力モード)では、通常、行の最初の文字として入力し、改行(ENTER)を続けなければなりません。Windowsに

CTRLZはライン上の任意の場所に入力されたが、それでも改行が続いする必要がありますすることができます。

UNIXでは、sttyコマンドを使用して、EOFを送信することを端末インターフェイスに通知する実際の文字を設定できます。あなたはeof^DCTRLD)に設定されていることを二行目の終わりに見ることができます

speed 38400 baud; rows 45; columns 150; line = 0; 
intr = ^C; quit = ^\; erase = ^H; kill = ^U; eof = ^D; 
eol = <undef>; eol2 = <undef>; swtch = ^Z; start = ^Q; 
stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; 
flush = ^O; min = 1; time = 0; -parenb -parodd cs8 -hupcl 
-cstopb cread -clocal -crtscts -ignbrk brkint -ignpar -parmrk 
-inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany 
-imaxbel opost -olcuc -ocrnl onlcr -onocr -onlret -ofill 
-ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo 
-echoe -echok -echonl -noflsh -tostop -echoctl -echoke 

:あなたはstty -aを実行する場合は、何かのように表示されます。例えば、CTRLにXそれを設定する

stty eof ^x 

:あなたはでこれを変更することができます。他にもたくさんのものを設定することができますが、そのほとんどがあなたの現在の端末を使用できないようにしますので、注意してください:-)

最終的には、ファイルが終了したことをプログラムに伝えたい場合はCTRLD UNIX用(または問題が解決しない場合はsttyを確認してください)またはWindows用CTRLZ。あなただけの入力のラインを取得したい場合は、次のように、あなたのコードで\n文字を使用します。

#include <stdio.h> 
int main (void) { 
    long nc = 0; 
    while(getchar() != '\n') 
     ++nc; 
    printf("%ld\n", nc); 
    return 0; 
} 
+0

端末プロセスに 'SIGSTOP'を送るためにttyドライバで使われているので、'^X'をunixで使わないで 'EOF'文字と衝突します。また、cookedモードでは、unixは '〜D 'をEOFとして認識します。ただし、after beforeを使用する必要はありません(ただし、** rawモードでは認識されません)。何が起こるかは、 '^ D'が戻り値なしで読み込みを成功させ、時には' read '(2)**システム呼び出しが0文字を返す 'D'を必要とすることです。 0文字の読み取りとして認識されます)。 –

+0

@ルイス、CTRL-Xは、それを変更する方法を示す例に過ぎず、潜在的に端末が応答しなくなるという警告が付いていました。 – paxdiablo

0

EOF Working

は、あなたの入力し、キーを押してWindows用 その後、Ctrl + Zを入力書きますUnixの場合はctrl + dと入力し、Enterキーを押します。 画像iで見ることができます。 それは間違いありません。

関連する問題