这是一段代码段。我对内部缓冲的工作方式感到困惑。
while(true)
{
cout << "Enter a character: ";
cin.ignore(3, '\n');
ch = cin.get(); // ch is char type
cout << "char: ch: " << ch << endl;
}
实际上cin.ignore(3, '\n')
会忽略前三个字符然后获得下一个直接字符。直到这一点,它的罚款。因为,我将其保留在while
循环中,我试图检查ignore()
和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:
只是为了检查缓冲,故意我给了4个字符而不是1.在第一种情况下,它很好并得到它。从第二点开始,忽略似乎不起作用。当我输入5个字符时,我没有得到这个行为。
需要对此进行解释。 :)
答案 0 :(得分:3)
根据std :: cin.ignore的文档(streamsize n = 1,int delim = EOF):
从输入序列中提取字符并丢弃它们,直到提取了n个字符,或者一个比较等于delim。 http://www.cplusplus.com/reference/istream/istream/ignore/
您将abcd\n
置于stdin上。您的第一个ignore(3,'\n')
移除了abc
,而您的get()移除了d
。 \n
仍留在缓冲区中。
然后将efgh\n
添加到现在包含\nefgh\n
的缓冲区。你的下一个ignore()会读取 3个字符或换行符,无论先发生什么。由于您的换行符是缓冲区中的第一个,因此只会忽略换行符。
您可能希望在请求更多输入之前清空stdin缓冲区。您可以通过修改get()调用或在请求更多输入之前添加第二个ignore()调用来实现此目的。
答案 1 :(得分:2)
cin.ignore(3, '\n')
忽略最多三个字符,在找到一行(即\n
字符)后停止。
在第一行输入后,缓冲区将包含5个字符abcd\n
。因此ignore
忽略abc
,get
获取d
,留下\n
。
在第二行之后,它包含\nefgh\n
。因此,ignore
只会忽略行尾字符,get
会返回e
。
如果要在提取字符后丢弃剩下的行,请再次使用ignore
:
cin.ignore(numeric_limits<streamsize>::max(), '\n');