繁体   English   中英

为什么tcflush不能用于scanf?

[英]Why doesn't tcflush work for 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 ,读取大量数据,将它们放入缓冲区,然后使用该缓冲区返回一个char。 然后你tcflush刷新系统级缓冲区但对C缓冲区什么都不做,所以下面的scanf能够在其中找到回车符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM