C 标准库 atoi 函数的实现

/*
 * atoi 是一个解析字符串的一个函数
 * 可以将字符串解析为 int 类型
 * 解决如下的问题:
 *   1 空白符
 *   2 正号和负号
 *   3 进制
 *   4 溢出
 */
#include <cstdio>

/*
int atoi(const char *str) {
    char *p = (char *)str;
    int ret = 0;
    int retPre = 0;
    int over_flow = 1<<(sizeof(int)*8-1);
    int sign = 1;
    int base = 10;

    // 跳过空白符
    while (*p==' ' || *p=='\t') {
        ++p;
    }

    // 判定符号
    if (*p=='-') sign = -1, ++p;
    else if (*p=='+') sign = 1, ++p;
    else sign = 1;

    // 判定进制
    if (*p=='0' && *(p+1)=='x' || *(p+1)=='X') base=16, p+=2;
    else if(*p=='0') base=8, ++p;
    else base = 10;

    while (*p != '\0') {
        retPre = ret;
        if ((*p>='0'&&*p<='7') || (base!=8&&*p>='8'&&*p<='9')) {
            ret *= base;
            ret += *p - '0';
        }
        else if (base==16 && ((*p>='a' && *p<='f') || (*p>='A' && *p<='F'))) {
            ret *= base;
            switch (*p) {
                case 'a': case 'A': ret += 10; break;
                case 'b': case 'B': ret += 11; break;
                case 'c': case 'C': ret += 12; break;
                case 'd': case 'D': ret += 13; break;
                case 'e': case 'E': ret += 14; break;
                case 'f': case 'F': ret += 15; break;
                default: break;
            }
        }
        else {
            break;
        }

        // 溢出处理
        if (sign==-1 && ret==over_flow) {
            break;
        }
        else if ((ret&over_flow)==over_flow) {
            ret = retPre;
            break;
        }

        ++p;
    }

    if (sign==-1) ret = -ret;

    return ret;
}
*/

int atoi(const char *str) {
    char *p = (char *)str;
    int ret = 0;
    int sign;

    // 跳过空白符
    while (*p==' ' || *p=='\t') {
        ++p;
    }

    // 判定符号
    if (*p=='-') sign = -1, ++p;
    else if (*p=='+') sign = 1, ++p;
    else sign = 1;

    // 只处理十进制
    while (*p>='0' && *p<='9') {
        ret *= 10;
        ret += *p - '0';
        ++p;
    }

    if (sign==-1) ret = -ret;

    return ret;
}

int main() {
    printf("%d\n", atoi(" -2147483648002"));
    printf("%d\n", atoi(" -2147483650"));
    printf("%d\n", atoi(" 2147483647"));
    printf("%d\n", atoi(" 2147483648"));
    printf("%d\n", atoi(" 012"));
    printf("%d\n", atoi(" 10"));
    printf("%d\n", atoi(" 0xa"));
    return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值