我有这个简单的代码接受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
能够找到回车符。