LeetCode 之 String to Integer (atoi) — C 实现

String to Integer (atoi)

Implement atoi to convert a string to an integer.

Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases.

Notes: It is intended for this problem to be specified vaguely (ie, no given input specs). You are responsible to gather all the input requirements up front.

实现 atoi 将字符串转化成整数。

暗示:考虑所有可能的输入情况。

说明:我们故意使问题模糊,你应该集合上面要求的所有可能的输入。

分析:

需要考虑所有的输入情况,忽略字符串首尾的空格,字符串首非空字符+-为合法字符,其他非数字字符为非法字符,字符串中数字字符后第一次遇见非数字字符时停止转换,考虑整数的溢出


int myAtoi(char* str) {
    int minusflag = 0;
    long long int number = 0;/*避免整型溢出*/
    char *pstr = str;
    char *pdigStart = str, *pdigEnd = NULL;
    
    if(NULL == str || NULL == *str)/*空指针*/
        return 0;
        
    /*开头为空格,找出非空格开头*/
    if(*str == ' ' || *str == '\t')
    {
        while(*pstr && (*pstr == ' ' || *pstr == '\t'))
        {
            ++pstr;
        }
        if(!*pstr)/*字符串全是空格*/
        {
            return 0;
        }
        else
        {
            pdigStart = pstr; /*第一个非空格字符*/
        }
    }
    
    /*为负数,标志置1*/
    if(*pdigStart == '-')
    {
        minusflag = 1;
        ++pdigStart;
    }
    else if(*pdigStart == '+')
    {
        ++pdigStart;
    }
    
    /*找到合法字符0-9*/
    for(pstr = pdigStart; *pstr && (*pstr >= '0' && *pstr <= '9'); ++pstr);
 
    pdigEnd = pstr - 1;
    /*字符转数字*/
    for(pstr = pdigStart; pstr <= pdigEnd; ++pstr)
    {   
        number = 10*number + (*pstr - '0');
        if(number > 0x7fffffff) /*溢出*/
        {
            if(minusflag == 0)/*正数,返回上界*/
            {
                return (int)2147483647;
            }
            else /*负数下界*/
            {
                return (int)(-2147483648);
            }
        }
    }
    if(minusflag) /*为负数*/
    {
        number *= -1;
    }
   
    return number;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值