当我多次使用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;
}
答案 0 :(得分:8)
答案 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
说明符已在内部忽略前导空格,因此在这些情况下您无需明确拼写。