输入缓冲如何在 C++ 中工作

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 个字符时,我没有得到这种行为。

需要对此进行解释。:)

Pur*_*reW 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() 调用来实现此目的。