2017-04-18 3 views
-3

私はgetcharを使ってユーザーから文字を取得し、それを数えるプログラムを書いています。これは、ユーザーがEOFを入力したときに停止し、charカウントを出力して印刷を完了したものとみなされます。コード:EOFに関するgetcharの奇妙な振る舞い

char cur = 0; 
int count = 0; 
while((cur = getchar()) != EOF){ 
    ++count; 
} 
printf("\n%d", count); 
printf("\ndone\n"); 

ただし、ユーザーが連続する2つのEOFを入力するまでループは停止しません。 文字がEOFでループが壊れていても動作していないかどうかを手動でチェックして、ループを強制的に停止しようとしました。

ただ1つのEOFの後に停止するにはどうすればよいですか?

+0

ユーザーはどのように「EOF」を入力しますか?これは鍵ではなく、何らかの形で通知される状態です。どのキーを押しましたか? – chux

+1

'EOF'キー(Linuxでは' Ctrl-D'、Windowsでは 'Ctrl-Z')は改行の後の最初の文字でなければなりません。それでも、なぜキーボードから複数の「EOF」が必要なのかを理解していない。 –

+1

私はLinuxでCTRL + Dを使用しています –

答えて

2

getchar関数は、charではなく、intを返すように宣言されています。結果をcharに割り当てるので、EOFをキャプチャすることはできません。

curのデータ型をintに変更します。

EDIT:

これが最も可能性の高い端末がEOFを処理する方法に関係しています。私がこれをテストしたときに、行に1つ以上の文字を入力してCtrl + Dを押すと、文字(マイナスのCTRL-D)がプログラムに送信され、getcharで読み取られます。私がCTRL-Dを1行だけ押すと、前の行を入力するためにENTERを押しても、EOFが検出されます。

ファイルをこのプログラムの標準入力にリダイレクトすると、ファイルの終わりに達したときにEOFが検出されます。

+2

最初のEOFがcharから認識できない場合、2番目の理由は何ですか? – Yunnosch

+0

ありがとう、魔法のように鳴らしましたが、質問はまだ私に興味がありますなぜ2回目は動作しますが、最初は動作しませんか? –