把一串字符(字符指针表示的)转换为整数,要考虑以下情况:
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]!=‘\0‘ && (isspace(str[i]))) i++; if(str[i]==‘-‘){ flag=-1; i++; } else if(str[i]==‘+‘) i++; else ; while(str[i]!=‘\0‘ && 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,一起判断是否越界,不能在最后才加符号。
时间: 2024-11-05 14:51:34