只需写3-4行即可重现该问题。在“ for循环”中使用cin >>
重复获取输入后,所有下一个cin >> (s)
都会被跳过。
除cin
以外的任何内容/其他都可以正常工作。(只是想知道为什么会发生这种情况,我该怎么做才能在程序中进一步使用cin
)
for(int x;cin >> x;){
cout << x <<endl;
}
int a;
cin >>a;
没有错误消息。
答案 0 :(得分:5)
您所做的使cin >> x
失败(破坏循环)的任何事情也只会影响cin >> a
,因为这是相同的dang命令!
对象cin
不“知道”您的循环逻辑,您的操作系统/终端也不知道,一般而言,它也不知道您打算一旦发生“复位”就可以了循环中断。您必须自己发信号。但是,您可能不能仅仅为此打补丁,原因是:
std::cin
对象将在其上设置EOF标志,并且该标志持续存在。 (有时您可以手动清除此内容,但我不建议您这样做,因为您可能会在发送方感到困惑,具体取决于您的平台……)您将不得不找到另一种打破循环的方法,要么通过一些“魔术保留号”,或者通过拥有更复杂的输入协议,或者仅读取一些初始输入的 n 条,或者其他方式取决于您要执行的操作。
答案 1 :(得分:0)
for
标头中的第二个表达式是循环条件;只要是这样,循环就会继续运行。您的条件始终为真,因此永远不会退出循环。
您可以在循环中添加一些代码以退出它,例如if (x == 0) break;
但是,我建议重新设计循环。您的循环条件非常不寻常,会使大多数人在弄清楚发生了什么之前会有些头疼。也许您可以将读取操作放在循环体内?
>>
的工作方式
对于std::basic_istream
(std::cin
是其中之一),>>
运算符被重写以实现格式化的数据提取,并且被设计为可链接的(例如,cin >> a >> b >> c
) 。之所以有效,是因为:
>>
是左关联的,因此它分组为((cin >> a) >> b) >> c)
>>
返回对流对象的引用,因此您可以根据需要继续添加更多的>>
。此外,std::basic_istream
可以转换为bool
,并且只要没有发生错误,就可以转换为true
。因此,您的循环条件始终为cin
,并且由于您可能没有收到错误,因此始终为真。