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

C++中stoi转string为int触发std::invalid_argument异常求助

问题分析与解决

错误原因

std::stoi抛出std::invalid_argument异常,说明传入的字符串s无法被解析为合法整数,常见触发场景:

  • s是空字符串(比如初始调用时s为空且k=0,直接进入基准条件)
  • s包含非数字字符(输入的a本身含非数字,或拼接过程中混入非法字符)

修复方案

1. 基准条件前置校验字符串有效性

在调用stoi前先检查s的合法性,根据业务逻辑处理异常情况:

int solve(string a, int i, int k, string s) {
    int n = a.length();
    if (i == n and i != k) return 1000;
    if (i == k) {
        // 处理空字符串场景
        if (s.empty()) {
            return 0; // 或根据需求返回错误码、默认值
        }
        // 检查是否全为数字字符
        bool isValid = true;
        for (char c : s) {
            if (!isdigit(c)) {
                isValid = false;
                break;
            }
        }
        if (!isValid) {
            return 1000; // 非法字符时返回错误值
        }
        int t = stoi(s);
        cout << t;
        return t;
    }
    int incl = solve(a, i + 1, k, s + a[i]);
    int excl = solve(a, i + 1, k, s);
    return min(incl, excl);
}

2. 保证基准条件触发时s有效

如果业务逻辑要求i==k时s必须是有效数字串,可调整递归逻辑:

  • 初始调用时避免传入空串,或设置k的取值范围大于0,确保递归过程中s能积累至少一个数字字符
  • 提前校验输入的a是纯数字字符串,避免拼接出非法内容

3. 捕获异常(可选)

若无法提前规避异常场景,可通过try-catch捕获并处理:

if (i == k) {
    int t = 1000; // 默认错误值
    try {
        t = stoi(s);
        cout << t;
    } catch (const std::invalid_argument& e) {
        cout << "无法转换的字符串: " << s;
    } catch (const std::out_of_range& e) {
        cout << "字符串数值超出int范围: " << s;
    }
    return t;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 18:22:50