C - 当输入超过fgets允许值时退出程序

时间:2012-11-23 16:16:29

标签: c passwords exit fgets

我有以下用C编写的程序:

该程序的主要问题是如果在使用fgets()函数时输入超过80个字符,程序将立即退出。执行其他代码,但不等待用户按Enter键。它就像在最后忽略了getchar一样。

我该如何解决这个问题?

2 个答案:

答案 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()没有的内容。