標准庫函數atoi的實現


標准庫函數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》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM