Cin在for循环中使用后被跳过

时间:2019-06-07 13:12:01

标签: c++ cin

只需写3-4行即可重现该问题。在“ for循环”中使用cin >>重复获取输入后,所有下一个cin >> (s)都会被跳过。

cin以外的任何内容/其他都可以正常工作。(只是想知道为什么会发生这种情况,我该怎么做才能在程序中进一步使用cin

for(int x;cin >> x;){
        cout << x <<endl;
}
int a;
cin >>a;

没有错误消息。

2 个答案:

答案 0 :(得分:5)

您所做的使cin >> x失败(破坏循环)的任何事情也只会影响cin >> a,因为这是相同的dang命令!

对象cin不“知道”您的循环逻辑,您的操作系统/终端也不知道,一般而言,它也不知道您打算一旦发生“复位”就可以了循环中断。您必须自己发信号。但是,您可能不能仅仅为此打补丁,原因是:

  • 如果您按Ctrl + C组合键结束程序,则该程序已结束。
  • 如果您按Ctrl + D(Linux / macOS)或Ctrl + Z(Windows),则为流提供了“文件结束”条件,它将不再接受。 std::cin对象将在其上设置EOF标志,并且该标志持续存在。 (有时您可以手动清除此内容,但我不建议您这样做,因为您可能会在发送方感到困惑,具体取决于您的平台……)

您将不得不找到另一种打破循环的方法,要么通过一些“魔术保留号”,或者通过拥有更复杂的输入协议,或者仅读取一些初始输入的 n 条,或者其他方式取决于您要执行的操作。

答案 1 :(得分:0)

for标头中的第二个表达式是循环条件;只要是这样,循环就会继续运行。您的条件始终为真,因此永远不会退出循环。

您可以在循环中添加一些代码以退出它,例如if (x == 0) break;

但是,我建议重新设计循环。您的循环条件非常不寻常,会使大多数人在弄清楚发生了什么之前会有些头疼。也许您可以将读取操作放在循环体内?

>>的工作方式

对于std::basic_istreamstd::cin是其中之一),>>运算符被重写以实现格式化的数据提取,并且被设计为可链接的(例如,cin >> a >> b >> c) 。之所以有效,是因为:

  1. >>是左关联的,因此它分组为((cin >> a) >> b) >> c)
  2. >>返回对流对象的引用,因此您可以根据需要继续添加更多的>>

此外,std::basic_istream可以转换为bool,并且只要没有发生错误,就可以转换为true。因此,您的循环条件始终为cin,并且由于您可能没有收到错误,因此始终为真。