实现atoi

实现atoi

作为一只程序猿,面试时经常会被要求实现atoi,快排这种看起来很简单,但是写对了却不容易的函数。今天试着写了一下atoi,记个笔记。

假设要实现的atoi函数原型是

int Atoi(const char* str);

以下几点必须要考虑到:

  1. 正常流程,即如何从一个常规字符串如“1234”得到整型1234
  2. str是否为空指针
  3. 处理str开头的空格,比如“ 10”这种字符串
  4. 考虑正负号,如“+23”,“-34”
  5. 考虑字符串中的非法字符,如“124a234"
  6. 考虑溢出,感觉这个最难

最后贴上我写的代码,欢迎指摘。

// test whether base*10 + offset will overflow, 
// base is positive number and offset is between 0~9.
bool WillOverflow(int base, int offset, bool positive)
{
    ASSERT (offset <=9 && offset >= 0);
    if(base < 0)
        return true;

    if(base < INT_MAX/10)
        return false;

    if(base > INT_MAX/10)
        return true;

    if (positive)
    {
        return offset > 7;
    }
    else
    {
        return offset > 8;
    }
}

int Atoi(const char *str)
{
    //1.判断是否为空指针
    if (str == 0)
        return 0;

    //2.开头的空格和0不考虑
    while(*str == ' ' || *str == '0')
        str ++;

    int n = 0;
    int s = 1;
    for(const char *p=str; *p!=0; p++)
    {
        //3.考虑正负号
        if(p == str)
        {
            if(*p == '+')
            {
                s = 1;
                continue;
            }
            else if(*p == '-')
            {
                s = -1;
                continue;
            }
        }

        //4.考虑非法字符
        if(*p>'9' || *p<'0')
            return s * n;


        //5.考虑溢出
        if(WillOverflow(n, *p-'0', s==1))
        {
            if(s == 1)
                return INT_MAX;
            else
                return INT_MIN;
        }


        //6.正常流程
        n = n*10 + *p - '0';
    }

    return s * n;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值