【问题标题】:How does cin.ignore work with cin and getline?cin.ignore 如何与 cin 和 getline 一起使用?
【发布时间】:2016-12-23 02:14:41
【问题描述】:

这里有两个 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;
}

【问题讨论】:

    标签: c++ input cin getline


    【解决方案1】:

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

    更详细,如果您键入:

    line1
    line2
    line3
    

    缓冲区包含:

    line1\nline2\nline3\n
    ^
    

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

    line1\nline2\nline3\n
         ^
    

    当您执行cin &gt;&gt; string2 时,它会找到下一个单词的开头(下一个l 字符),完成后缓冲区如下所示:

    line1\nline2\nline3\n
                ^
    

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

    line1\nline2\nline3\n
                  ^
    

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

    【讨论】:

      猜你喜欢
      • 2014-03-06
      • 2017-08-18
      • 2014-11-28
      • 1970-01-01
      • 1970-01-01
      • 2014-03-08
      • 2018-05-10
      • 2021-04-06
      • 1970-01-01
      相关资源
      最近更新 更多