程序退出我用C写的下面的程序:Ç - 当输入超过与fgets津贴
与该程序的主要问题是,如果输入使用时与fgets()函数,程序公正出口超过80个字符立即。其他代码被执行,但不等待用户按Enter键。它就像简单地忽略了最后的getchar。
请问我该如何解决这个问题?
程序退出我用C写的下面的程序:Ç - 当输入超过与fgets津贴
与该程序的主要问题是,如果输入使用时与fgets()函数,程序公正出口超过80个字符立即。其他代码被执行,但不等待用户按Enter键。它就像简单地忽略了最后的getchar。
请问我该如何解决这个问题?
如果用户输入的长度大于fgets
可能从stdin
中读取的79个字符(它最多可以读取一个小于其大小参数所说的字符,因为它将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()
没有。
您可能需要重新考虑换行符的自动删除(除了您提到的问题,以下简单回答)。如果输入超过80个字符,则缓冲区中不会有新行,并且您正在覆盖用户数据。不是一个严重的错误,只是在这种情况下,会丢失密码内容。 – WhozCraig