atoi的正确实现

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.

spoilers alert... click to show requirements for atoi.

Requirements for atoi:

The function first discards as many whitespace characters as necessary until the first non-whitespace character is found. Then, starting from this character, takes an optional initial plus or minus sign followed by as many numerical digits as possible, and interprets them as a numerical value.

The string can contain additional characters after those that form the integral number, which are ignored and have no effect on the behavior of this function.

If the first sequence of non-whitespace characters in str is not a valid integral number, or if no such sequence exists because either str is empty or it contains only whitespace characters, no conversion is performed.

If no valid conversion could be performed, a zero value is returned. If the correct value is out of the range of representable values, INT_MAX (2147483647) or INT_MIN (-2147483648) is returned.


class Solution {
public:
    /*
        基本思路:
        
            主要是注意转换过程中可能出现的溢出情况
            
            如果不考虑溢出,转换的式子很简单:res = res*10 + cur;
            
            但就是这句话,有可能导致溢出:
            
            第一:当res*10的时候溢出,如,对于8字节的数字 1239,当转换到123时,还没有溢出,但是执行*10时,本身就溢出了,如果不处理,就会造成截断处理
            第二:当执行 + cur 时的溢出,这个很好理解
            
            所以代码中需要有两个地方主义溢出检测
            
            
        2014年9月5日18:45:16
        
    */
    int atoi(const char *str) {
        int index = 0;
        int flag = 1;
        unsigned int res = 0;
        if(str == NULL){
            return 0;
        }
        
        while(*str!='\0'&&*str==' '){
            str++;
        }
        if(*str == '+'){
            str++;
        }
        else if(*str == '-'){
            str++;
            flag = -1;
        }
        while(*str!='\0'&&*str>='0'&&*str<='9'){
            unsigned int cur = *str - '0';
            unsigned int pre = res;
            res = res * 10;
            //判断是不是由于*10导致溢出
            if((res/10) != pre){
                if(flag == 1){
                    return INT_MAX;
                }
                else{
                    return INT_MIN;
                }
            }
            
            //做加法
            res += cur;
            
            //做加法以后有可能溢出
            if(res >= INT_MAX){
                //是负数
                if(flag == -1){
                    //下溢
                    if( res >= (INT_MAX + 1)){
                        return INT_MIN;
                    }
                    //并没有溢出
                    str++;
                    continue;
                }
                //上溢
                return INT_MAX;
            }
            str++;
        }

        return flag*res;
    }
};







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值