c 语言 scanf - fflush(stdin) - 不起作用

c language scanf - fflush(stdin) - doesnt work

当我多次使用 scanf 时,程序不会等待另一次输入。相反它退出

我了解到我可以在 scanf 函数中的转换说明符之前放置一个空白 space - 是的,这解决了问题,我想这与输入流有关,也就是说 - 如果它是输入流中的换行符 scanf 将立即使用它。

scanf(" %f", &value);

但如果是这样 - 为什么我不能改用 fflush(stdin)?我试过了,还是不行。

#include <stdio.h>

int main(void)
{
    float value;
    char ch;

    printf("input value: ");
    scanf("%f", &value);
    fflush(stdin);
    printf("input char: ");
    scanf("%c", &ch);

    return 0;
}

fflush() 用于清除输出缓冲区。由于您正在尝试清除输入缓冲区,这可能会导致未定义的行为。

这是一个 SO 问题,解释了为什么这不是好的做法:

Using fflush(stdin)

根据 C11 标准文档,第 7.21.5.2 章,fflush() 函数,(强调我的)

int fflush(FILE *stream);

If stream points to an output stream or an update stream in which the most recent operation was not input, the fflush function causes any unwritten data for that stream to be delivered to the host environment to be written to the file; otherwise, the behavior is undefined.

所以,基本上,使用 fflush(stdin);undefined behaviour

为了达到您的目的,在使用 %c 格式说明符时,您可以将代码重写为

scanf(" %c", &ch);
       ^
       |
   notice here

%c 之前的前导空格跳过所有类似字符的空格(包括通过按前一个 ENTER 键存储的 \n)并读取第一个非空白字符。

注意:由于 %d%f 说明符已经在内部忽略了前导空格,因此在这些情况下您不需要显式指定。