我试图用递归解决一个问题,给出的数字是std::string
的形式,所以在基本情况下,我试图通过使用stoi
函数将其转换为int
来返回数字,但编译器给出了一个荒谬的错误。
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) {
cout << stoi(s);
int t = stoi(s);
return t;
}
int incl = solve(a, i + 1, k, s + a[i]);
int excl = solve(a, i + 1, k, s);
return min(incl, excl);
}
编译者说
terminate called after throwing an instance of 'std::invalid_argument'
what(): stoi
2条答案
按热度按时间d6kp6zgx1#
如果字符串中的字符不表示有效的整数,则
std::invalid_argument
将抛出stoi()
。假设您的算法是正确的,避免运行时错误的一种方法是添加一个检查(使用std::is_digit
),如果std::string
中的char
实际上是一个数字。**旁注:**你从来不检查
s
是否为空...s
使用基于范围的for
-循环遍历,如果std::string
中的char
无效,则抛出std::invalid_argument
,这在main中处理。ztigrdn82#
首先,正如注解中所指出的,这不是编译器错误。相反,它是在运行时抛出的exception。
根据CPPReference,
std::stoi()
抛出std::invalid_argument
“如果不能执行转换”。这意味着无论
s
的内容是什么,它都不能正确地转换为整数。在不知道
s
的内容的情况下,确实不可能知道转换失败的原因,但以下是一些可能的原因:s
包含文本字符,例如“asdf120”s
包含逗号分隔值,如“1,13,25”1.其他我没想到的原因。
我建议创建一些包含
s
值的调试打印输出到类似std::cout
的地方,并确保它是一个正确的整数。