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

时间:2015-04-19 13:44:01

标签: c stdin scanf fflush

当我多次使用scanf时,程序不会等待另一个输入。而是退出

我了解到我可以在scanf函数中的转换说明符之前放置一个空格 - 是的,这解决了问题,我想这与输入流有关,即 - 如果它是输入流中的换行符, 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;
}

2 个答案:

答案 0 :(得分:8)

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

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

Using fflush(stdin)

答案 1 :(得分:5)

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

  

int fflush(FILE *stream);

     

如果stream指向输入流或未输入最新操作的更新流,则fflush函数会将该流的任何未写入数据传递到主机环境被写入文件; 否则,行为未定义。

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

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

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

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

注意:由于%d%f说明符已在内部忽略前导空格,因此在这些情况下您无需明确拼写。