要想让字符串转换为整型大家可能觉得很简单,直接一个循环,然后num=num*10+(*str-'0');就OK,但其实并不是这样,我们要考虑它的多种可能会产生的情况,如下
“12345”正常情况,可以用上式循环的到想要的结果“+12345”和“-12345”,带有符号位的情况“abcd1234”,带有特殊字符的情况“”,字符串内部什么都没有的情况字符串不存在的情况“1234567890012345567”,值远远超过int的最大范围的情况 #include<stdio.h> #include<assert.h> #include<ctype.h> #include<limits.h> enum State { INVALID,//0 VALID,//1 }; enum State state = INVALID; int my_atoi(char *str) { int flag = 1;//标志位,标志是正数还是负数 long long int ret = 0; assert(NULL != str); if(*str == '+') { ++str; } if(*str == '-') { flag = -1; ++str; } if(*str == '\0') { return 0; } while(*str) { if(isdigit(*str)) { ret = ret*10+(*str-'0')*flag; if(ret>INT_MAX||ret<INT_MIN) { return (int)ret; } ++str; } else { break; } } if(*str == '\0') { state = VALID; } return ret; } int main() { int ret = my_atoi("123"); return 0; }