私はCで書かれた次のプログラムを持っています:
このプログラムの主な問題は、fgets()関数を使用しているときに入力が80文字を超えると、プログラムがすぐに終了することです。他のコードは実行されますが、ユーザーがEnterキーを押すのを待ちません。最後にgetcharを単に無視するようなものです。
どうすればこの問題を解決できますか?
ユーザー入力が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?
}
}
改行文字がによって読み取られたかどうかを確認し、読み取られfgets()
なかった場合は、改行文字が検出されるまで入力をスキップします。
if (0 == strrchr(password, '\n'))
{
/* Skip until new-line. */
int c;
while (EOF != (c = getchar()) && '\n' != c);
}
それ以外の場合、への呼び出しは、そうでないgetchar()
ものを読み取りますfgets()
。