为什么C++程序在第一个输入循环后无法接收第二个输入?
问题原因
第一个输入循环终止时,std::cin 的错误标识位(failbit/eofbit)已经被置位:
- 若通过输入EOF(Windows系统按
Ctrl+Z,Linux/macOS系统按Ctrl+D)结束第一组输入,会触发eofbit - 若输入了非
double类型的非法字符结束第一组输入,会触发failbit
错误位未被手动清除时,后续所有对std::cin的输入操作都会直接返回失败,因此第二个循环不会等待输入,直接跳过执行。
解决方法
在两次输入的间隙,先清除std::cin的错误状态,再清空输入缓冲区中残留的无效数据即可:
- 调用
cin.clear()清除所有错误标识位,让cin恢复可输入状态 - 调用
cin.ignore()清空缓冲区残留的无效字符,避免残留的非法字符直接触发下一次输入失败。如果要清空整个缓冲区直到换行符,可以传入参数:cin.ignore(numeric_limits<streamsize>::max(), '\n'),使用该参数需要引入<limits>头文件。
修正后代码
#include <iostream> #include <vector> #include <limits> // 引入numeric_limits所需头文件 using namespace std; int main() { vector<double> v1; for(double temp1; cin >> temp1;) { v1.push_back(temp1); } cout << "input1" << endl; // 清除错误状态+清空缓冲区 cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); vector<double> v2; for (double temp2; cin >> temp2;) { v2.push_back(temp2); } cout << "input2" << endl; return 0; }
内容的提问来源于stack exchange,提问作者MegaNoob
相关产品推荐
相关产品推荐

