You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 05:40:54