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

如何在用户向int vector输入char值时捕获bad_alloc异常?

解决C++输入非int类型时终止循环的问题

问题根源

  • cin >> input在输入非int类型时不会抛出异常,只会设置流的错误状态位(failbit),所以你的try...catch完全起不到作用,循环会一直执行。
  • 变量input初始值是0,输入失败时input的值不会被更新,导致每次循环都往vector里塞0,这就是你看到大量0的原因。
  • 另外odd_product初始化为0,后续乘任何奇数结果都是0,逻辑错误,应该初始化为1。

修正方案

  1. 去掉不必要的try...catch,直接检查输入操作的返回值(cin >> input会返回cin对象,当流处于错误状态时会被视为false)。
  2. 输入失败后,清除流的错误状态并跳过缓冲区里的无效字符,避免死循环。
  3. 修正odd_product的初始值为1。

修正后的代码

// 计算偶数和与奇数乘积
#include <iostream>
#include <vector>
#include <limits> // 用于numeric_limits
using namespace std;

int main(){
    vector<int> list;
    int even_sum = 0, odd_product = 1, input; // 修正odd_product初始值,input无需初始化

    cout << "请输入数字,输入非数字将终止输入\n";

    while (cin >> input) { // 输入成功才执行循环体
        list.push_back(input);
    }

    // 处理输入失败后的清理,避免后续操作出问题
    cin.clear(); // 清除错误状态
    cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 跳过缓冲区中剩余的无效字符

    for (int num : list) { // 用范围for循环更简洁
        if (num % 2 == 0) {
            even_sum += num;
        } else {
            odd_product *= num;
        }
    }

    cout << "偶数和:" << even_sum << endl;
    cout << "奇数乘积:" << odd_product << endl;

    return 0;
}

异常处理的替代方案

如果一定要用异常处理实现,可以通过cin.exceptions(ios::failbit);让cin在输入失败时抛出ios_base::failure异常,此时需要捕获这个特定异常:

#include <iostream>
#include <vector>
#include <stdexcept> // 用于ios_base::failure
using namespace std;

int main(){
    vector<int> list;
    int even_sum = 0, odd_product = 1, input;

    cout << "请输入数字,输入非数字将终止输入\n";

    cin.exceptions(ios::failbit); // 设置cin在failbit触发时抛出异常
    try {
        while (true) {
            cin >> input;
            list.push_back(input);
        }
    } catch (const ios_base::failure&) {
        // 输入失败,终止循环
    }

    for (int num : list) {
        if (num % 2 == 0) {
            even_sum += num;
        } else {
            odd_product *= num;
        }
    }

    cout << "偶数和:" << even_sum << endl;
    cout << "奇数乘积:" << odd_product << endl;

    return 0;
}

不过这种方式对于新手来说,不如直接检查流状态直观,日常场景中前者更常用。

内容的提问来源于stack exchange,提问作者GabboClown

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 21:45:19