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

不借助外部函数复现atoi()函数的实现方法咨询

嘿,这个需求我太懂了!要自己实现atoi()的核心,关键就是搞定字符到对应整数的转换——其实根本不用什么库函数,利用ASCII码的规律就可以轻松做到。

核心:字符转数字的本质

你肯定知道,字符'0'到'9'在ASCII表中是连续排列的,'0'的ASCII值是48,'1'是49,以此类推。所以只要把目标字符减去'0'的ASCII值,就能得到它对应的整数值:

char c = '5';
int num = c - '0'; // num的值就是5,不是'5'的ASCII码53

这一步完全是纯算术操作,不需要调用任何额外函数,完美符合你的要求。

完整实现atoi()的步骤

接下来我们把这个核心逻辑扩展成完整的atoi实现,还要处理标准atoi的各种细节:

1. 跳过前导空格

标准atoi会忽略字符串开头的所有空格,所以我们先移动指针跳过这些字符:

while (*str == ' ') {
    str++;
}

2. 处理正负号

判断字符串是否有正负号标记,记录符号后移动指针到数字部分:

int sign = 1;
if (*str == '+' || *str == '-') {
    sign = (*str == '-') ? -1 : 1;
    str++;
}

3. 逐字符转换数字

循环读取每个字符,只处理'0'到'9'的字符,逐步累积结果:

long long result = 0; // 用long long避免中间计算溢出
while (*str >= '0' && *str <= '9') {
    result = result * 10 + (*str - '0');
    // 提前判断是否溢出int范围
    if (result > INT_MAX) {
        break;
    }
    str++;
}

4. 处理溢出和返回结果

根据符号和累积结果,返回符合标准的int值:

if (result > INT_MAX) {
    return (sign == 1) ? INT_MAX : INT_MIN;
}
return (int)(result * sign);
完整代码示例

把上面的步骤整合起来,加上必要的头文件,就是一个完整的自定义atoi实现:

#include <stdio.h>
#include <limits.h>

int my_atoi(const char *str) {
    // 处理空字符串
    if (str == NULL || *str == '\0') {
        return 0;
    }

    // 跳过前导空格
    while (*str == ' ') {
        str++;
    }

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

    // 转换数字并处理溢出
    long long result = 0;
    while (*str >= '0' && *str <= '9') {
        result = result * 10 + (*str - '0');
        // 溢出判断
        if (result > INT_MAX) {
            break;
        }
        str++;
    }

    // 根据符号返回结果,处理溢出情况
    if (result > INT_MAX) {
        return (sign == 1) ? INT_MAX : INT_MIN;
    }
    return (int)(result * sign);
}

// 测试用例
int main() {
    printf("%d\n", my_atoi("123"));       // 输出123
    printf("%d\n", my_atoi("   -456"));   // 输出-456
    printf("%d\n", my_atoi("789abc"));    // 输出789
    printf("%d\n", my_atoi("2147483648"));// 输出INT_MAX(2147483647)
    printf("%d\n", my_atoi("-2147483649"));// 输出INT_MIN(-2147483648)
    return 0;
}
额外注意点
  • 我用了long long来存储中间结果,是为了避免在计算过程中提前溢出,如果你的环境不支持long long,也可以用int但要更小心地做溢出判断(比如在乘以10之前就检查是否会超过INT_MAX/10)。
  • 标准atoi遇到非数字字符就会停止转换,所以我们的实现也遵循这个逻辑。

内容的提问来源于stack exchange,提问作者Cameron Shirley

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:06:10