繁体   English   中英

cin.ignore如何与cin和getline一起使用?

[英]How does cin.ignore work with cin and getline?

在这里,有两个cin,据我所知,每个cin都会在缓冲区中保留'\\ 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的行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM