我有以下用 C 编写的程序:
这个程序的主要问题是,如果在使用 fgets() 函数时输入超过 80 个字符,程序就会立即退出。其他代码被执行,但是它不等待用户按下回车。它就像简单地忽略了最后的 getchar。
请问我该如何解决这个问题?
如果用户输入的长度超过可以读取的 79 个字符fgets
(stdin
它最多可以读取比其大小参数少一个,因为它以 0 终止缓冲区),剩余的输入将留在输入缓冲区中,因此getchar()
at结束立即成功。
为避免这种情况,如果输入太长,您需要清除输入缓冲区。
问题是如果输入足够短,你不知道是否清除缓冲区。所以检查你是否真的读入了换行符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()
未读取的内容。