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

编写不依赖C标准库函数的字符串转整数程序遇阻求助

修复字符串转整数的实现问题

你的代码存在几个关键错误,导致无法正常完成字符串转整数的功能,以下是问题点和修复方案:

核心错误点

  • 正负号处理后直接返回符号值:原代码在识别到+或-后,设置完sign就直接return sign,这会导致程序只返回±1,完全跳过了后续数字的转换逻辑,这是最致命的问题。
  • 循环结束后错误返回0:遍历完所有数字字符后,你返回的是0而不是计算好的num * sign,等于白做了数字累加。
  • 遇到非数字直接返回0:常规的字符串转整数逻辑是遇到非数字字符就停止转换,返回当前已经转换好的数值,而不是直接返回0。
  • 冗余头文件:代码里引入了<string.h>但完全没用到,可以移除,符合“不依赖多余标准库”的要求。

修复后的代码

#include <assert.h>
#include <stddef.h>

int StringToInteger(const char *str) {
    int num = 0;
    int sign = 1;
    assert(str != NULL);

    // 处理正负号前缀
    if (*str == '+' || *str == '-') {
        sign = (*str == '-') ? -1 : 1;
        str++;
    }

    // 遍历并转换数字字符
    while (*str != '\0') {
        if (*str >= '0' && *str <= '9') {
            // 处理32位有符号整数溢出问题
            if (num > (2147483647 / 10) || (num == 2147483647 / 10 && (*str - '0') > 7)) {
                return sign == 1 ? 2147483647 : -2147483648;
            }
            num = num * 10 + (*str - '0');
        } else {
            // 遇到非数字字符,停止转换
            break;
        }
        str++;
    }

    return num * sign;
}

修复说明

  1. 移除了无用的<string.h>头文件,严格控制依赖。
  2. 删除了正负号处理后的错误return语句,保证后续数字能被正常转换。
  3. 循环结束后返回num * sign,得到带正确符号的最终结果。
  4. 遇到非数字字符时改为break,这样像"123abc"这类字符串会被正确转换为123。
  5. 添加了溢出处理逻辑,避免转换超大数字时出现未定义行为(适配32位有符号整数的范围)。

内容的提问来源于stack exchange,提问作者nitzan teharlev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 15:31:58