【问题标题】:cin.ignore() is producing undesired behaviorcin.ignore() 正在产生不良行为
【发布时间】:2017-12-21 07:34:43
【问题描述】:

对于以下代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin >> t;
    while(t--)
    {
        string s;
        getline(cin,s);
        cout << s << "\n";
        cin.ignore(1000,'\n');
    }
    return 0;
}

示例输入:

2

姓名1

名字2

预期输出:

姓名1

名字2

错误输出:

Name2 // 后跟空行

我不知道为什么会这样。我尝试了 stackoverflow 上给出的所有解决方案,但不幸的是没有一个对我有用。在此先感谢。

【问题讨论】:

  • 删除对ignore的调用。它正在吃下一行。如果您不明白原因,请阅读规范std::basic_istream::ignore
  • 删除 ignore 也不会产生预期的输出。
  • 离题:小心#include&lt;bits/stdc++.h&gt; 它不会为您节省很多工作,它是非标准的(因此它只适用于单个编译器)并且与using namespace std; 结合使用会使您面临一些不必要的风险。
  • 第二个问题是cin &gt;&gt; t; 在输入时不使用代表您按回车的新行。此换行符被第一个 getline 占用并产生一个空字符串。

标签: c++ getline flush


【解决方案1】:

cin.ignore() 用于在输入整数后忽略新行。 所以,在cin&gt;&gt;t 之后使用cin.ignore()

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin >> t;
    cin.ignore();
    while(t--)
    {
        string s;
        getline(cin,s);
        cout << s << "\n";
    }
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    • 2019-05-24
    • 1970-01-01
    • 2019-11-16
    相关资源
    最近更新 更多