字符串转化为整数
- 不使用atoi类似的库函数,将字符串转换为整形。
- 写一个把字符串的IP地址变成32位整数的函数。
1、思路:
核心:num = num * 10 + (*str - '0')。但是要考虑诸多方面因素:1、str是否为NULL,或为空"";2、正负号问题;3、数字溢出或是可能不是0~9之间的字符。所以要设置相应的全局变量来标记异常情况,只有str为"0"时,才正常输出0。那么程序整个过程是先设置输出0和全局变量为false,只有没有异常,才输出数字并将全局变量设置为true。
1 enum Status {kValid = 0, kInvalid}; 2 int g_nStatus = kValid; 3 4 int StrToInt(const char* str) 5 { 6 g_nStatus = kInvalid; 7 long long num = 0; 8 9 if(str != NULL && *str != '\0') 10 { 11 bool minus = false; 12 if(*str == '+') 13 str ++; 14 else if(*str == '-') 15 { 16 str ++; 17 minus = true; 18 } 19 20 if(*str != '\0') 21 { 22 num = StrToIntCore(str, minus); 23 } 24 } 25 26 return (int)num; 27 } 28 29 long long StrToIntCore(const char* digit, bool minus) 30 { 31 long long num = 0; 32 33 while(*digit != '\0') 34 { 35 if(*digit >= '0' && *digit <= '9') 36 { 37 int flag = minus ? -1 : 1; 38 num = num * 10 + flag * (*digit - '0'); 39 40 if((!minus && num > 0x7FFFFFFF) 41 || (minus && num < (signed int)0x80000000)) 42 { 43 num = 0; 44 break; 45 } 46 47 digit++; 48 } 49 else 50 { 51 num = 0; 52 break; 53 } 54 } 55 56 if(*digit == '\0') 57 { 58 g_nStatus = kValid; 59 } 60 61 return num; 62 }