1

私はCで書かれた次のプログラムを持っています:

このプログラムの主な問題は、fgets()関数を使用しているときに入力が80文字を超えると、プログラムがすぐに終了することです。他のコードは実行されますが、ユーザーがEnterキーを押すのを待ちません。最後にgetcharを単に無視するようなものです。

どうすればこの問題を解決できますか?

4

2 に答える 2

2

ユーザー入力がfgets読み取り可能な79文字より長い場合stdin(サイズパラメーターが示すよりも多くても1文字少なく読み取ることができます。これは、バッファーを0で終了するためです)、残りの入力は入力バッファーに残されますgetchar()。終わりはすぐに成功します。

これを回避するには、入力が長すぎる場合に入力バッファをクリアする必要があります。

問題は、入力が十分に短い場合、バッファをクリアするかどうかがわからないことです。したがって、実際に改行が読み込まれたかどうかを確認してくださいfgets

int len = strlen(password);
if (password[len-1] == '\n') {
    // got a newline, all input read, overwrite newline
    password[len-1] = 0;
} else {
    // no newline, input too long, clear buffer
    int ch;
    while ((ch = getchar()) != EOF && ch != '\n');
    if (ch == EOF) {
        // input error, stdin closed or corrupted, what now?
    }
}
于 2012-11-23T16:18:53.980 に答える
1

改行文字がによって読み取られたかどうかを確認し、読み取られfgets()なかった場合は、改行文字が検出されるまで入力をスキップします。

if (0 == strrchr(password, '\n'))
{
    /* Skip until new-line. */
    int c;
    while (EOF != (c = getchar()) && '\n' != c);
}

それ以外の場合、への呼び出しは、そうでないgetchar()ものを読み取りますfgets()

于 2012-11-23T16:19:08.370 に答える