4

当我多次使用 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;
}
4

2 回答 2

8

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

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

使用 fflush(stdin)

于 2015-04-19T13:55:12.270 回答
6

按照C11标准文档,第 7.21.5.2 章,fflush()功能,(强调我的)

int fflush(FILE *stream);

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

所以,基本上,使用fflush(stdin);未定义的行为

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

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

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

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

于 2015-04-19T14:06:49.717 回答