leetcode:atoi

转换原则:忽略前导空格,从+-或数字开始转换,中间出现非数字break,注意判断乘法加法溢出,大于INT_MAX输出INT_MAX,小于INT_MIN输出INT_MIN

int atoi(const char *str) {
    if (str==NULL)
    {
        return 0;
    }
    int ans=0,pos=1,pre;
    while (*str==' '|| *str=='	') ++str;
    if (*str=='-'){
        pos=-1;
        ++str;
    }
    else if (*str=='+')
    {
        pos=1;
        ++str;
    }
    if (!isdigit(*str))
        return 0;
    ans=(*str-'0')*pos;
    ++str;
    
    for (;*str!='';++str){
        if (isdigit(*str)){
            pre=ans;
            if (pos==1&&pre>INT_MAX/10){
                ans=INT_MAX;
                break;
            }
            if (pos==-1&&pre<INT_MIN/10){
                ans=INT_MIN;
                break;
            }
            pre=ans*10;
            ans=ans*10+(*str-'0')*pos;
             if (pos==1&&ans<pre){
                ans=INT_MAX;
                break;
            }
            if (pos==-1&&ans>pre){
                ans=INT_MIN;
                break;
            }
        }
        else break;
    }
    
    return ans;
}
原文地址:https://www.cnblogs.com/mintmy/p/4162430.html