剑指offer面试题49atoi函数的编写

/*
这本书终于进入了最后一章。。太激动了
这里的题目是一个特别寻常普遍的 写atoi  意思是 ASCII to Integer
是面试实例 有很多经典的地方要注意的
需要注意的地方
1 检查是否是空指针
2 如果是空指针 标记一个全局变量来区分 是得到0还是空指针
3 如果是空字符串
4 正符号的问题
5 非法输入的问题
6 边界值的问题
*/
#include<iostream>
#include<cstdio>
using namespace std;
enum Status{valid=0,invalid};
int status=valid;
//一开始觉得 最后计算结果再加符号就可以了。但是 注意正负的最大值是不一样的 所以还是压根开始就判断了保险
long long StrToIntCore(const char * str,bool minus)
{
    long long num=0;
    int flag= minus? -1 :1;
    while(*str!='\0')
    {
        if(*str>='0' && *str<='9')
        {
            num=num*10+flag * (*str-'0');
            if((!minus && num>0x7FFFFFFF) || (minus && num<(int)0x80000000))//注意这里后面必须是int 才是负数的最小
               {
                   num=0;
                   break;
               }
            str++;
        }
        else
        {
            num=0;
            break;
        }
    }
    if(*str=='\0')
    status=valid;
    return num;
}

int atoi(const char * str)
{
    status=invalid;
    long long sum=0;//如果超过了int 就是 sum大于了int的最大值
    if(str!=NULL && *str!='\0')//不是空指针 不是空串
    {
        bool minus_1=false;//负数
        if(*str=='+')
        str++;
        else if(*str=='-')
        {
            str++;
            minus_1=true;
        }
        if(*str!='\0')
        {
            sum=StrToIntCore(str,minus_1);
        }
    }
    return (int) sum;
}


int main()
{
    char str[100];
    while(scanf("%s",str)!=EOF)
    {
        cout<<atoi(str)<<endl;
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值