標准庫函數atoi用於將字符串類型的數據轉換為整形數據:在轉換過程中要考慮空指針、空字符串""、正負號,溢出等情況
這里是將字符串str轉換為32位整型,其正數的最值為0x7FFFFFFF,負數的最小值為0x80000000(可參考有符號類型的最小負數的補碼的由來),通過這兩個值來判斷是上溢還是下溢,此外,用一個全局變量來表明是否是非法輸入的問題。
代碼如下:(vs2010調試正確)
1 //實現atoi_32函數 2 //正數數的最大值為0x7FFFFFFF,最小值為0x80000000,考慮數字會溢出的情況 3 #include <stdio.h> 4 #include <stdlib.h> 5 #include <ctype.h> 6 7 enum {kValid = 0,kInvalid}; 8 int g_nStatus = kValid; //全局變量用於判斷是非法輸入還是字符串為空 9 10 long long StrToInt(const char *s,int sign) 11 { 12 long long num = 0; 13 while(*s != '\0'){ 14 if(!isdigit(*s)){ 15 g_nStatus = kInvalid; //表示非法輸入 16 num = 0; 17 break; 18 } 19 num = num * 10 + *s - '0'; 20 if(sign > 0 && sign * num > 0x7FFFFFFF || 21 sign < 0 && sign * num < (signed int)0x80000000){ //注意這里的類型提升,因此要強制轉換 22 num = 0; 23 break; 24 } 25 s++; 26 } 27 return sign * num; 28 } 29 int atoi_32(const char *s) 30 { 31 long long num; 32 int sign; 33 sign = 1; 34 35 if(s == NULL || *s == '\0'){ 36 return 0; 37 } 38 if(*s == '+') 39 ++s; 40 else if (*s == '-'){ 41 ++s; 42 sign = -1; 43 } 44 if (*s == '\0'){ 45 g_nStatus = kInvalid; //表示非法輸入 46 return 0; 47 } 48 else 49 num = StrToInt(s,sign); 50 51 return (int)num; 52 } 53 54 int main() 55 { 56 char s[1024]; 57 gets(s); 58 printf("%d\n",atoi_32(s)); 59 system("pause"); 60 return 0; 61 }
PS:參考《劍指offer》
