jav*_*ava 3 c stdin scanf fflush
当我多次使用scanf时,程序不会等待另一个输入.相反,它退出
我了解到我可以在scanf函数中的转换说明符之前放置一个空格 - 是的,这解决了问题,我想这与输入流有关,即 - 如果它是输入流中的换行符,scanf将消耗它立刻.
scanf(" %f", &value);
Run Code Online (Sandbox Code Playgroud)
但如果是这样 - 为什么我不能使用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;
}
Run Code Online (Sandbox Code Playgroud)
根据C11标准文件,第7.21.5.2章,fflush()功能,(强调我的)
int fflush(FILE *stream);如果
stream指向输入流或未输入最近操作的更新流,则该fflush函数会将该流的任何未写入数据传送到主机环境以写入该文件; 否则,行为未定义.
所以,基本上,使用fflush(stdin);是未定义的行为.
为了达到您的目的,在使用%c格式说明符时,您可以将代码重写为
scanf(" %c", &ch);
^
|
notice here
Run Code Online (Sandbox Code Playgroud)
在%c跳过像字符一样的所有空格之前的前导空格(包括\n按下前一个ENTER键存储的空格)并读取第一个非空白字符.
注意:as %d和%f说明符已经在内部忽略了前导空格,在这些情况下你不需要显式拼写.