【问题标题】:Issue with getting input from C++ [duplicate]从 C++ 获取输入的问题 [重复]
【发布时间】:2014-07-03 15:21:48
【问题描述】:

我使用的代码是这样的:

string input;
cout<<"First line"<<endl;
cin>>input;
cout<<"second line: "<< input << endl;
getline(cin, input);
cout<<"third line: "<< input << endl;

但是,当我输入 54 时说输出是这样的:

First line
>56
second line: 56
third line: 

然后程序终止,甚至没有要求另一个输入。这很奇怪,因为以下确实按预期工作:

string input;
cout<<"First line"<<endl;
getline(cin, input);
cout<<"second line: "<< input << endl;
getline(cin, input);
cout<<"third line: "<< input << endl;

即输入和输出是:

First line
>56
second line: 56
>45
third line: 45

【问题讨论】:

  • getline() 消耗 \ncin &gt;&gt; 不消耗。
  • 要读取整行使用std::getline(),提取运算符&lt;&lt; 只是从输入中读取单个空格分隔的字段

标签: c++ input output


【解决方案1】:

我相信第一个示例不会提示额外输入,因为 >> 运算符不会在您的第一个输入(换行符)末尾使用空格,然后随后的 getline() 调用会使用该换行符并停止寻找更多意见。

如果我的假设成立,那么我认为对getline() 的两次调用应该首先返回一个空字符串,然后它会提示输入。

【讨论】:

  • 你相信吗?还是你确定?
  • 我什么都不确定。见鬼,我不确定计算是一个确定的过程,而是一个非常准确的启发式。
  • 根据我的经验,这是一门非常确定性和精确的科学。小段代码的假设总是可以很容易地通过单元测试用例(这是我们的物理实验等价物)得到证明
【解决方案2】:

在执行cin&gt;&gt;input 之后,换行符仍保留在流中,这意味着getline 返回一个空字符串。您可以尝试在致电getline 之前执行cin.ignore(std::numeric_limits&lt;std::streamsize&gt;::max()) 或仅cin.ignore()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    相关资源
    最近更新 更多