我们知道stdin
默认情况下是缓冲输入;证明这一点的证据是使用任何“留下数据”的机制stdin
, 例如scanf()
:
int main()
{
char c[10] = {'\0'};
scanf("%9s", c);
printf("%s, and left is: %d\n", c, getchar());
return 0;
}
./a.输出
你好
你好,左边是 10
10
当然是换行符...
我一直很好奇,有没有什么办法可以“偷看”stdin
缓冲而不删除任何可能存在的东西?
EDIT
更好的例子可能是:
scanf("%9[^.]", c);
输入“at.ct”后,现在我有了“数据”(ct\n
) 仍然开着stdin
,不仅仅是换行符。
可移植的是,您可以使用以下命令获取输入流中的下一个字符getchar()
然后将其推回ungetc()
,这会导致一种状态,就好像该字符没有从流中删除一样。
The ungetc
函数压入指定的字符c
(转换为unsigned char
)返回到由流指向的输入流。推回的字符将通过该流上的后续读取以推回的相反顺序返回。
标准仅保证一个推回字符,但通常,您可以推回更多字符。
正如其他答案中提到的。实际上,如果您提供自己的缓冲区,您几乎肯定可以查看缓冲区setvbuf
,尽管这并非没有问题:
If buf
不是空指针,它指向的数组可以用来代替由setvbuf
功能
这使得所提供的缓冲区可能根本无法使用。
任何时候数组的内容都是不确定的。
这意味着您无法保证缓冲区的内容反映实际输入(如果我们挑剔的话,如果缓冲区具有自动存储持续时间,则使用缓冲区会产生未定义的行为)。
然而,实际上,主要问题是找出缓冲区中缓冲输入的尚未消耗部分的开始位置和结束位置。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)