为什么tcflush不能用于scanf?

我有这个简单的代码接受3个字符,:

char a,b,c; scanf("%c",&a); scanf("%c",&b); scanf("%c",&c); printf("%c",a); printf("%c",b); printf("%c",c); 

我明白为什么这将只接受2个字符,因为第二个scanf接受回车。 但是,如果使用__fpurge(stdin); 代码在每个scanf之间按预期工作。 但是如果我使用read(STDIN_FILENO,&a,1); 而不是scanf,它不起作用。 对于read() ,只有tcflush(STDIN_FILENO,TCIOFLUSH); 工作,但它与scanf失败。 有人能解释我为什么吗?

fpurge清空C级缓冲区,这是scanf工作的级别。

tcflush在较低级别(系统级别)执行,这是read工作的级别。

scanf使用read来填充自己的缓冲区。

所以在第一种情况下:用scanf清空C缓冲区运行良好,但在系统级别上什么都不做。

在第二种情况下,清空系统缓冲区当然可以使用read而不是使用scanf因为在使用scanf ,至少达到回车的数据已经存在于C缓冲区中。 第一个scanf读取大量数据,将它们放入一个缓冲区,然后使用该缓冲区只返回一个字符。 然后你用tcflush刷新系统级的缓冲区,但是对C缓冲区什么都不做,所以下面的scanf能够找到回车符。