代码改变世界

leetcode:atoi

2014-12-14 12:32  MengYu1  阅读(124)  评论(0编辑  收藏  举报

转换原则:忽略前导空格,从+-或数字开始转换,中间出现非数字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=='\t') ++str;
    if (*str=='-'){
        pos=-1;
        ++str;
    }
    else if (*str=='+')
    {
        pos=1;
        ++str;
    }
    if (!isdigit(*str))
        return 0;
    ans=(*str-'0')*pos;
    ++str;
    
    for (;*str!='\0';++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;
}