OJ练习6——T8

把一串字符(字符指针表示的)转换为整数,要考虑以下情况:

1.忽略开始的空白字符

2.如果第一个非空白字符不是表示数字的正负号,就返回0

3.越界就返回界(即大于INT_MAX就返回INT_MAX,小于INT_MIN就返回INI_MIN)

【分析】

题目比较简单,要考虑的情况也容易想到,但是处理起来有细节要注意。

int atoi(const char *str) {
        int i=0;
        int flag=1;
        long long result=0;
        if(str==NULL)
            result=0;
        while(str[i]!='' && (isspace(str[i])))
            i++;
        if(str[i]=='-'){
            flag=-1;
            i++;
        }
        else if(str[i]=='+') i++;
        else ;
         while(str[i]!='' && isdigit(str[i])){
            result=result*10+str[i]-'0';
           
            if(flag*result>2147483647){
                result=2147483647;
                break;}
            if(flag*result<-2147483648){
                result=-2147483648;
                break;}
            i++;
        }
        return flag*result;
    }

【总结】

在最后越界处理上花费了很多时间,如果数据超大,远远超过INT_MAX或INT_MIN,就必须在达到界时就返回,否则会转换成其他的数不能判为越界。

所以判断越界否要在循环里面进行。

测试例有一例为,输入-2147483648,由于正负的界不是对称的,如果不先加上符号一起判断,就不能得到正确的-2147483648,而是得到-2147483647.

所以flag*result,一起判断是否越界,不能在最后才加符号。

原文地址:https://www.cnblogs.com/ketchups-notes/p/4227736.html