c语言scanf-fflush(stdin)-不工作

c语言scanf-fflush(stdin)-不工作,c,stdin,scanf,fflush,C,Stdin,Scanf,Fflush,当我多次使用scanf时,程序不会等待其他输入。相反,它退出了 我了解到我可以在scanf函数中的转换说明符之前放一个空格-是的,这解决了问题,我猜这与inputstream有关,也就是说-如果它是inputstream中的换行符,scanf将立即使用它 scanf(" %f", &value); 但是如果是这样的话,为什么我不能使用fflush(stdin)来代替呢?我试过了,但没用 #包括 内部主(空) { 浮动值; char ch; printf(“输入值:”); scanf(“

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

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

scanf(" %f", &value);
但是如果是这样的话,为什么我不能使用fflush(stdin)来代替呢?我试过了,但没用

#包括
内部主(空)
{
浮动值;
char ch;
printf(“输入值:”);
scanf(“%f”和“值”);
fflush(stdin);
printf(“输入字符:”);
scanf(“%c”和“ch”);
返回0;
}
fflush()
用于清除输出缓冲区。由于您试图清除输入缓冲区,这可能会导致未定义的行为

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


根据
C11
标准文件,第7.21.5.2章,
fflush()
功能,(重点)

intfflush(文件*流)

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

因此,基本上,使用
fflush(stdin)

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

scanf(" %c", &ch);
       ^
       |
   notice here
%c
之前的前导空格跳过所有类似空格的字符(包括按上一个回车键存储的
\n
),并读取第一个非空格字符


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

您在哪里声明了变量“koppling”?您使用的编译器/操作系统是什么?@BlueMoon-gcc/ubuntuRight
fflush(stdin)
在标准C中是未定义的行为。但是一些实现支持它刷新
stdin
。例如,Linux上的GLUBC支持它,但它是非标准的。POSIX在后期指定了一些非常特殊的行为,但是它可能是最好的,因为它需要在输入流上成功地使用它。OP已经知道了SCANF思想中的领先空白。他以前不需要为%f`添加空格,这就是我添加解释的原因。:-)