1

这是一个代码片段。我对内部缓冲的工作方式感到困惑。

  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()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: 

只是为了检查缓冲,我故意给了 4 个字符而不是 1。在第一种情况下,它很好并且得到了它。从第二个开始,忽略似乎不起作用。当我输入 5 个字符时,我没有得到这种行为。

需要对此进行解释。:)

4

2 回答 2

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')删除abc和你的 get() fetches d\n保留在缓冲区中。

然后你添加efgh\n到现在包含\nefgh\n. 您的下一个 ignore() 读取3 个字符或换行符,无论先出现什么由于您的换行符首先在缓冲区中,因此仅忽略换行符。

您可能希望在请求更多输入之前清空标准输入缓冲区。您可以通过修改 get() 调用或在请求更多输入之前添加第二个 ignore() 调用来实现此目的。

于 2013-05-24T10:34:24.150 回答
2

cin.ignore(3, '\n')最多忽略三个字符,在找到行尾(即一个\n字符)后停止。

在第一行输入之后,缓冲区将包含 5 个字符,abcd\n. 所以ignore忽略abcget得到d,离开\n

在第二行之后,它包含\nefgh\n. 因此ignore,只需忽略行尾字符,然后get返回e.

如果要在提取字符后丢弃其余行,请ignore再次使用:

cin.ignore(numeric_limits<streamsize>::max(), '\n');
于 2013-05-24T10:36:46.443 回答