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
相关产品推荐
相关产品推荐

