如何让std::cin输入循环在输入完成或遇非数字时终止?
解决std::cin读取整数时循环无法退出的问题
你的循环while (std::cin >> currVal)会在成功读取整数时持续运行,只有当输入无法解析为整数(比如输入字母、符号),或者触发EOF(文件结束符)时才会退出。如果只是输入一串数字后按回车,std::cin会一直等待后续输入,不会自动终止循环,这就是代码卡在前一个循环的核心原因。
方法1:通过输入非数字或EOF终止循环
这是最贴合你当前代码逻辑的方式:
- 输入完所有数字后,输入一个非数字字符(比如
q)再按回车,循环会立即退出。 - 或者使用系统的EOF快捷键:Windows按
Ctrl+Z然后回车,Linux/macOS按Ctrl+D直接触发。
方法2:读取整行输入后解析(更符合用户输入习惯)
如果希望用户输入一行数字后按回车就自动终止循环,可以先读取整行输入,再用std::stringstream解析其中的整数,修改后的代码如下:
#include <iostream> #include <vector> #include <sstream> #include <string> // 改为const引用传递,避免不必要的vector拷贝 bool NumInVect(int num, const std::vector<int>& vect) { for (int val : vect) { if (val == num) { return true; // 找到目标后立即返回,无需遍历整个vector } } return false; } int main() { std::vector<int> tempVect; std::vector<int> finalVector; std::cout << "Enter the vector elements: "; std::string inputLine; std::getline(std::cin, inputLine); // 读取整行输入 std::stringstream ss(inputLine); // 将字符串转为可解析的流 int currVal; while (ss >> currVal) // 从流中逐个解析整数 { if (!NumInVect(currVal, tempVect)) { tempVect.push_back(currVal); } std::cout << currVal << std::endl; } std::cout << "knak\n"; for (int val : tempVect) { std::cout << val << " "; } std::cout << std::endl; return 0; }
额外优化提示
- 原
NumInVect函数采用值传递std::vector<int> vect,每次调用都会拷贝整个vector,效率低下,改为const std::vector<int>& vect引用传递能显著提升性能。 - 找到目标数字后立即返回,避免无意义的遍历,进一步优化函数效率。
内容的提问来源于stack exchange,提问作者Lario Sedic
相关产品推荐
相关产品推荐

