Cha*_*nya 1 c++ inputstream input-buffer
这是一个代码片段。我对内部缓冲的工作方式感到困惑。
while(true)
{
cout << "Enter a character: ";
cin.ignore(3, '\n');
ch = cin.get(); // ch is char type
cout << "char: ch: " << ch << endl;
}
Run Code Online (Sandbox Code Playgroud)
实际上cin.ignore(3, '\n')忽略前三个字符,然后获取下一个直接字符。到那一点就好了。因为,我把它保持在一个while循环中,我试图检查ignore()and的行为get()。例如,我检查的输出是
Enter a character: abcd
char: ch: d
Enter a character: efgh
char: ch: e
Enter a character: ijkl
char: ch: i
Enter a character: mnopq
char: ch: m
Enter a character: char: ch: q
Enter a character:
Run Code Online (Sandbox Code Playgroud)
只是为了检查缓冲,我故意给了 4 个字符而不是 1 个。在第一种情况下,它很好并且得到了它。从第二个开始,忽略似乎不起作用。当我输入 5 个字符时,我没有得到这种行为。
需要对此进行解释。:)
根据 std::cin.ignore(streamsize n = 1, int delim = EOF) 的文档:
从输入序列中提取字符并丢弃它们,直到提取了 n 个字符,或者一个比较等于 delim。 http://www.cplusplus.com/reference/istream/istream/ignore/
您正在使用abcd\n标准输入。您的第一个ignore(3,'\n')removesabc和您的 get() fetches d。\n留在缓冲区中。
然后添加efgh\n到现在包含\nefgh\n. 你的下一个忽略()读取或者3个字符或换行,无论是第一位的。由于您的换行符是缓冲区中的第一个,因此只会忽略换行符。
您可能想在要求更多输入之前清空 stdin 缓冲区。您可以通过修改 get() 调用或在要求更多输入之前添加第二个 ignore() 调用来实现此目的。