cin.ignore如何使用cin和getline?

时间:2016-12-23 02:14:42

标签: c++ input cin 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;
}

1 个答案:

答案 0 :(得分: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读取该行。