我有以下用C编写的程序:
该程序的主要问题是如果在使用fgets()函数时输入超过80个字符,程序将立即退出。执行其他代码,但不等待用户按Enter键。它就像在最后忽略了getchar一样。
我该如何解决这个问题?
答案 0 :(得分:2)
如果用户输入的长度超过fgets
可能从stdin
读取的79个字符(它最多只能读取一个小于其大小参数的字符,因为它会终止缓冲区),剩下的输入留在输入缓冲区中,因此最后的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?
}
}
答案 1 :(得分:1)
检查fgets()
是否读取了换行符,如果在遇到换行符之前没有跳过输入:
if (0 == strrchr(password, '\n'))
{
/* Skip until new-line. */
int c;
while (EOF != (c = getchar()) && '\n' != c);
}
否则对getchar()
的调用将会读取fgets()
没有的内容。