C++编写递归函数实现字符串转整数 输出为负问题排查
代码问题定位
你的递归函数输出负数,核心是存在下标越界bug,同时缺少负号兼容逻辑:
- 下标越界:C++字符串下标从0开始计数,长度为n的字符串合法下标范围为0~n-1。代码中取最后一位数字时写的
s[s.length()],实际访问到了字符串末尾的结束符\0(ASCII码值为0),计算'\0' - '0'得到固定值-48,每一层递归都会叠加这个错误值,最终计算结果必然为负。 - 负号未处理:现有逻辑遇到带
-前缀的负数字符串时,会将负号的ASCII值参与数字计算,无法输出正确结果。
修正后的递归实现
保持你原有的递归思路(每次拆分出最后一位数字,递归计算前缀值后拼接结果),修正下标问题并补充负号处理,代码如下:
#include <iostream> #include <string> using namespace std; int convert1(string s) { bool isNegative = false; // 处理负号前缀 if (s[0] == '-') { isNegative = true; s = s.substr(1); } // 递归终止条件:剩余字符串仅1位数字 if (s.size() == 1) { return s[0] - '0'; } // 递归计算除最后一位外的前缀数值 int prefixVal = convert1(s.substr(0, s.size() - 1)); // 修正:取最后一位的正确下标为 s.size()-1 int lastDigit = s[s.size() - 1] - '0'; int res = prefixVal * 10 + lastDigit; return isNegative ? -res : res; } int main() { string s; cin >> s; cout << convert1(s) << endl; }
补充说明:如果需要转换的数字超出
int类型的取值范围,可以将函数返回值、中间变量类型替换为long long,避免整数溢出问题。
内容的提问来源于stack exchange,提问作者Chhavi Sharma
相关产品推荐
相关产品推荐

