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

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)

Cor*_*nik 8

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

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

使用fflush(stdin)


Sou*_*osh 5

根据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说明符已经在内部忽略了前导空格,在这些情况下你不需要显式拼写.