在 for 循环中使用后,Cin 被跳过
Cin getting skipped after being used in for loop
只是写了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
)。这是有效的,因为:
>>
是左关联,因此它分组为((cin >> a) >> b) >> c)
>>
返回对 stream 对象的引用,因此您可以根据需要继续添加更多>>
。
此外,std::basic_istream
可以转换为bool
,只要没有发生错误,就会true
。因此,你的循环条件总是cin
的,而且因为你大概没有收到错误,所以总是正确的。
- "error: no matching function for call to"构造函数错误
- 表示"accepting anything for this template argument" C++概念的通配符
- 如何在C++中从两个单独的for循环中添加两个数组
- 在Linux for Windows上编译C++代码时出错
- 调用专用模板时出错"no matching function for call to [...]"
- C++中的cin.ignore()函数不适用于整个流
- 为什么我的for循环不能正确获取argv
- 为什么我不能在 FOR LOOP 中使用 i/10,C++?
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- 在基于范围的for循环中使用结构化绑定声明
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- Problems with std::cin.fail()
- 通过for循环使用用户输入填充列表
- 在 for 循环中使用后,Cin 被跳过
- <vector> 与 cin 和 for() 循环C++一起使用
- C++ 只有第一个向量完成,push_back,cin,for 循环
- 如何打破这个 for 循环:"for (; cin >> A;);`
- C++for循环跳过cin.get()
- What is Scala for: getline(), std::cin.eof(), std::cin.bad()
- cin.Getline在for循环中出错