cin.ignore 如何与 cin 和 getline 一起工作?

How does cin.ignore work with cin and getline?

这里有两个 cins,据我所知,每个都在缓冲区中留下 '\n',因为它们跳过了空格。

Cin.ignore 默认只跳过一个字符,所以其中一个 '\n' 被去掉了。但是,缓冲区中还有一个 '\n',所以我希望 getline 看到 '\n' 并跳过 getline。

但是,当我 运行 这段代码时,我能够输入 string3。我哪里错了?

#include <iostream>
#include <string>
using namespace std;

int main()
{
  string string1, string2, string3;
  cout << "String1: ";
  cin >> string1;

  cout << "String2: ";
  cin >> string2; 

  cin.ignore();

  cout << "String3: ";
  getline(cin, string3);

  return 0;
}

cin >> string2 查找下一个单词的开头,并跳过 cin >> string1 之后留在缓冲区中的换行符。所以此时,只有第二个换行符还在缓冲区中,cin.ignore() 跳过它。

更详细,如果您输入:

line1
line2
line3

缓冲区包含:

line1\nline2\nline3\n
^

^显示缓冲区中的当前位置。一开始,它位于缓冲区的开头。在你做了 cin >> string1 之后,它看起来像:

line1\nline2\nline3\n
     ^

当您执行 cin >> string2 时,它会找到下一个单词的开头(下一个 l 字符),完成后缓冲区看起来像:

line1\nline2\nline3\n
            ^

然后 cin.ignore() 跳过下一个换行符,所以它看起来像:

line1\nline2\nline3\n
              ^

现在,当您调用 getline() 时,它会读取带有 line3 的行。