我们知道stdin
默认情况下是一个缓冲输入;那证明是在任何的stdin
说:“离开数据”机制的使用,如scanf()
:有没有办法查看stdin缓冲区?
int main()
{
char c[10] = {'\0'};
scanf("%9s", c);
printf("%s, and left is: %d\n", c, getchar());
return 0;
}
./a.out
你好
招呼,左边是10
10
是当然的换行符...
我一直很好奇,反正是有“窥视”的stdin
缓冲区没有删除可能驻留在那里?
编辑
一个更好的例子可能是:
scanf("%9[^.]", c);
随着 “at.ct” 的输入,现在我有 “数据”(ct\n
)留在stdin
,而不仅仅是一个换行符。
您可以在偷看后'ungetc()'。够好了? –
@DanielFischer - 我想这不坏...如果还有一大堆字符呢?我可以知道stdin上的数据长度吗?或者我可以'ungetc()'多于一个字符? – Mike
“一个字符的后退是有保证的,如果'ungetc'函数在同一个数据流上调用次数太多而没有对该数据流进行中间读取或文件定位操作,操作可能会失败。通常情况下,您可以“多个”取消选中,但只能保证一个。 –