web-dev-qa-db-ja.com

while((c = getchar())!= EOF)終了しません

私は「Cプログラミング言語」を読んでいて、入力と出力のこの部分にたどり着きました。

コンソールがenterをEOFとして認識しないという他のスレッドを読みました。使用するために CTRLZ Windowsまたは CTRLD Unixで(どちらも私のために働いていません)。

私はまた、彼らがそれを機能させることができると同じように尋ねている他の人々を読みました、彼らのコードの問題は構文であり、プログラムが終了しないことでした。

別の解決策はありますか?

これはコードです:

#include <stdio.h>
main()
{
    int nb, nl, nt, c;
    nb = 0;
    nl = 0;
    nt = 0;
    while ((c = getchar()) != '\n'){
        if (c == ' ')
            ++nb;
        else if (c == '\n')
            ++nl;
        else if (c == '\t')
            ++nt;
    }
    printf("Input has %d blanks, %d tabs, and %d newlines\n", nb, nt, nl);
}

編集:\nはEOFであるはずでしたが、投稿する前にいじっていて、変更したのを忘れていました:P

EOFでも機能しません、私はそれをスキップしました。

5
user2738586
while ((c = getchar())  !=EOF) {


}

次に、 Ctrl+Z または F6 Windowsの場合

以下は、最初に来る\nまたはEOFのいずれかを待ちます

while((c = getchar()) != '\n' && c != EOF){

}
4
P0W

Windowsでは、次のように入力します Ctrl-Z 単独で(スペースなどなしで)行に入力し、 Return その後。 Windowsでは、技術的にEOFインジケーターをスキップして文字を読み続けることができますが、EOFは実際にはEOFを意味するため、他のオペレーティングシステムには適用されません。

4
user539810
while ((c = getchar()) != '\n'){
    if (c == ' ')
        ++nb;
    else if (c == '\n')
        ++nl;
    else if (c == '\t')
        ++nt;
} 

Whileループの条件によっては、ユーザーが改行文字( '\ n')を入力すると、whileループが停止するため、改行の数をカウントできなくなります。

それ以外は、空白とタブのカウントは問題なく機能します。

CTRL+Z WindowsではEOFとして認識されます。ただし、プログラムで認識するには、whileループの条件を((c = getchar()) != EOF)として使用します。ユーザーがキーの組み合わせを押すと、次のようになります。 CTRL+Z、コンソールにEOFとして入力され、プログラムはそれを文字入力として認識する必要があります。

これを行うと、入力の行数を数えることができます

だから、私の提案は:

while ((c = getchar()) != EOF){
    if (c == ' ')
        ++nb;
    else if (c == '\n')
        ++nl;
    else if (c == '\t')
        ++nt;
} 
3
ANjaNA

UNIXシステムを使用している場合:

プログラムに入力を手動で入力しながらキーボードを介して [〜#〜] eof [〜#〜] をシミュレートする唯一の方法は CTRL+D

プログラムに入力を供給し、入力の最後にEOF)を通知できるようにするいくつかの方法を次に示します。

  • ここではstring 形式を使用して、ファイルの文字列表現をプログラムにフィードします。

    ./myprog <<< "これが処理する文字列です"

  • または、入力リダイレクトを使用して、入力を含むファイルをプログラムにフィードすることもできます。

    ./myprog <input.file

上記のメソッドはいずれも、次のコードで機能します。

#include <stdio.h>
#ifndef EOF
#define EOF (-1)
#endif
int main(void)
{
    int nb, nl, nt, c;
    nb = 0;
    nl = 0;
    nt = 0;
    while ((c = getchar()) != EOF){
        if (c == ' ')
            ++nb;
        else if (c == '\n')
            ++nl;
        else if (c == '\t')
            ++nt;
    }
    printf("Input has %d blanks, %d tabs, and %d newlines\n", nb, nt, nl);
    return 0;
}
  • ゲームからウィンドウを除外しないでください。 WindowsのキーボードでEOFをシミュレートするには、 CTRL+Z キーの組み合わせ

UNIXのhere-string形式がWindowsで使用できるかどうかはわかりませんが、入力のリダイレクトは同様である必要があります

2
smac89
    /* This program will calculate the number of blanks, tabs and new line in a text stream */

#include <stdio.h>

main () 
{
    int c,nl = 0, blank = 0, tab = 0; //Newline, blanks and tabs.
    while ((c = getchar()) != EOF) {
        if (c == '\n')
            ++nl;
        else if (c == '\t')
            ++tab;
        else if (c == ' ')
            ++blank;
}
    printf("Tabs = %d\nBlanks = %d\nNewLine = %d",tab, blank, nl);
}

私はこの次のコードを書きました、そしてそれはUbuntuで正しく動作します。あなたが書いたものと似ているので、私はコードを試しましたが、Ctrl-DはUNIXで正しく機能しています。

次のコードをテストしたところ、テキストストリームに\ nを入力しても、新しい行のカウンターは増えないことがわかりました。\ tタブでも同じことが言えます。改行の場合はEnterキーを押し、タブの場合はTabキーを押すだけで、カウンターによってカウントされます。これは注意すべき点です。

これは、Enterキーを押すと、実際には1文字の改行文字が配置されるのに対し、\ nの入力は異なる方法で扱われ、実際には2文字であるために発生します。

これがこの質問に付加価値を与えると思ったので、私もこのことを説明しました。ありがとう。

1
Darshit Mulani

まずはプレス CtrlZ これは印刷されます^ Z次にを押します Enter EOFに移動します。

0
user3647605

行を変更します

// Buggy, you want calculate the # of '\n' in loop body,
// so logically you shouldn't use it as a stop condition.
while ((c = getchar()) != '\n')

while ((c = getchar()) != EOF)

そして、WindowsのコンソールウィンドウでCtrl + Cを押してみてください。 Win7を実行している私のプラットフォームで動作します。

enter image description here

0
Eric Z