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

Cin getting skipped after being used in for loop

本文关键字:Cin for 循环      更新时间:2023-10-16

只是写了3-4行来重现问题。在"for 循环"中使用cin >>重复输入后,所有下一个cin >> (s)总是被跳过。

除了cin之外的任何东西/一切都可以正常工作。(只是想知道为什么会发生这种情况以及我该怎么做才能在程序中进一步使用cin)

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

无错误消息。

无论你做什么cin >> x失败(打破循环)也会影响cin >> a,因为它是同一个 dang 命令!

对象cin不"知道"你的循环逻辑,你的操作系统/终端也不知道,它通常也不知道你打算在循环中断后进行某种"重置"。你必须自己发出信号。但是,您可能无法只是修补它,因为:

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

你将不得不找到另一种方法来打破你的循环,要么使用一些"神奇的保留数字",要么使用更复杂的输入协议,要么只读取一些初始输入的n个数字,或者其他一些取决于你尝试做什么的方法。

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

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

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

>>的工作原理

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

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

此外,std::basic_istream可以转换为bool,只要没有发生错误,就会true。因此,你的循环条件总是cin的,而且因为你大概没有收到错误,所以总是正确的。