1

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

这个程序的主要问题是,如果在使用 fgets() 函数时输入超过 80 个字符,程序就会立即退出。其他代码被执行,但是它不等待用户按下回车。它就像简单地忽略了最后的 getchar。

请问我该如何解决这个问题?

4

2 回答 2

2

如果用户输入的长度超过可以读取的 79 个字符fgetsstdin它最多可以读取比其大小参数少一个,因为它以 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?
    }
}
于 2012-11-23T16:18:53.980 回答
1

检查是否读取了换行符fgets(),如果没有跳过输入,直到遇到换行符:

if (0 == strrchr(password, '\n'))
{
    /* Skip until new-line. */
    int c;
    while (EOF != (c = getchar()) && '\n' != c);
}

否则调用getchar()将读取fgets()未读取的内容。

于 2012-11-23T16:19:08.370 回答