有没有办法偷看stdin缓冲区?

Mik*_*ike 20 c buffer stdin peek

我们知道stdin默认情况下是缓冲输入; 证据就是使用"保留数据"的任何机制stdin,例如scanf():

int main()
{
    char c[10] = {'\0'};
    scanf("%9s", c);
    printf("%s, and left is: %d\n", c, getchar());
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

./a.out
你好,
你好,左边是10

10 当然是换行...

我一直很好奇,有没有办法"偷看" stdin缓冲区而不删除那里可能存在的东西?

编辑
一个更好的例子可能是:

scanf("%9[^.]", c);
Run Code Online (Sandbox Code Playgroud)

输入"at.ct"后,现在我还有"data"(ct\n)stdin,而不仅仅是换行符.

Dan*_*her 11

或者,您可以使用输入流中的下一个字符,getchar()然后将其推回ungetc(),这会导致状态,就好像该字符未从流中删除一样.

ungetc函数将由c(转换为unsigned char)指定的字符推回到stream指向的输入流.按推送的相反顺序,后续读取该流将返回推回的字符.

标准只保证了一个回击角色,但通常你可以更多地推回.

正如其他答案所述.那里的评论,在实践中,如果你提供自己的缓冲区,你几乎可以肯定地查看缓冲区setvbuf,虽然这不是没有问题:

如果buf不是空指针,则可以使用它指向的数组而不是setvbuf函数分配的缓冲区

这留下了可能根本不使用提供的缓冲区的可能性.

任何时候数组的内容都是不确定的.

这意味着您无法保证缓冲区的内容反映实际输入(如果它具有自动存储持续时间,如果我们挑剔则使用缓冲区未定义的行为).

但是,在实践中,主要问题是找出缓冲区中缓冲输入的尚未消耗部分的开始位置和结束位置.

  • 当输入缓冲区为空块时,不会执行`getchar`,直到有东西要读取? (2认同)