[英]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.