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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 03:15:48