2016-08-22 5 views
-3

Windows XPのPCにDev-C++ 5.11を使用してCプログラムを作成しました。それは私が、典型的な文字カウントプログラムとして見た一つだと次のようにそれが行く:文字カウントプログラムが正常に動作しない

#include <stdio.h> 

main() { 
    long nc; 
    nc = 0; 
    while (getchar() != EOF) { 
     ++nc; 
    } 
    printf("%ld", nc); 
} 

それは問題なくコンパイルされたが、それは私が入力したボタンを含める押す必要がある場合にのみ、文字間とそれが動作(\n) 。私がそれをしないと、0か何も印刷しません。私はタブやバックスペースのような他の文字を含めることを試みたが、まだ何もしなかった。私はそれを終了するためにCtrl + Cを使用しています。私は間違って何をしていますか?

+2

[while((c = getchar())!= EOF)可能な重複の可能性あり](http://stackoverflow.com/questions/18565663/while-c-getchar-eof-not-terminating ) –

+1

たぶん、 "それはすべきだ"とは思えないかもしれませんが、 "Enterボタン"を待つgetchar()関数を使用しているので、それだけで動作します。 –

+0

@DarkoDjuric: 'getchar()'は待ちません"enter"を押すと、入力が実際に 'stdin'に現れるのを待ちます。 2つは非常に異なるものです。 – DevSolar

答えて

0

バッファ入力。

入力を入力すると、端末(cmd.exe、xtermなど)によってバッファに入れられます。あなたのプログラムはまだこの時点でその入力を「見ている」わけではありません。 enterを押した後でなければ、ターミナルはバッファ内容をプログラムに送ります。

Enterキーを押す前にプログラムを終了すると、何も送信/処理されません。

0

プログラムは正常に動作するはずです。ファイルを次のようにリダイレクトして実行してみてください。

問題は、端末によるファイルの終了の処理から発生します。 Windowsの場合はCtrl-Z<enter>、Unixの場合はCtrl-Dと入力してファイルの終わりを知らせます。

しかし、あなたがこのようにプログラムを書く必要があることを注意:

#include <stdio.h> 

int main(void) { 
    long nc; 
    nc = 0; 
    while (getchar() != EOF) { 
     ++nc; 
    } 
    printf("%ld\n", nc); 
    return 0; 
} 
0

getchar()はEOFまで読み取ります。したがって、whileループが終了するまで(つまり、getchar()関数がEOFを返す)まで、printf()出力は表示されません。

EOFを送信するには、Ctrl + Dキーを押します。あなたの入力を入力し、CTRL + Dを押して、それが動作するかどうかを調べてみてください。少なくともUNIX/OS Xでは、これはEOFを送信します。また、文字を比較することもできます。特定のキーが押された場合は、ループを終了してカウントを確認します。

別のプログラムからの出力でパイプしている場合は、出力がパイプに入った後にEOFを受け取るので、これはうまくいくはずです。たとえば、catファイル| ./counterprogram

関連する問題