atoi 函数实现

 
要考虑的东西实在也挺多的。总结如下:
 
1 前面空格分隔符号的时候
 
2 第一个符号位处理+ -
 
3 遇到非数字字符退出
 
4 为正数的时候,大于INT_MAX上溢
 
5 为负数的时候, 小于INT_MIN下溢
 
6 为空字符串或者空指针的时候
 
 1  int atoi(const char *str)  
 2     { 
 3         if (str == nullptr) return 0; 
 4         //注意:判断空字符串数组 
 5         if(*str == '\0') return 0; 
 6         long long llnum = 0; 
 7         int sign = 1; 
 8    
 9         while (*str == ' ') 
10         { 
11             str++; 
12         } 
13         if (*str == '-') 
14         { 
15             sign = -1; 
16             str++; 
17         } 
18         //注意:不要溜了要判断+号的情况 
19         else if(*str == '+') 
20         { 
21             str++; 
22         } 
23         while (*str >= '0' && *str <= '9') 
24         { 
25             int i = *str - '0'; 
26             llnum = llnum*10 + i; 
27             if (llnum*sign > INT_MAX) 
28             { 
29                 llnum = INT_MAX; 
30                 break; 
31             } 
32             else if (llnum*sign < INT_MIN) 
33             { 
34                 llnum = INT_MIN; 
35                 break; 
36             } 
37             str++; 
38         } 
39         return int(sign*llnum); 
40     }  

 

头文件<limits.h>和INT_MAX和INT_MIN的含义用法。

一般情况下,C中int类型32位,范围是-2147483648到2147483647.

(1)最轻微的上溢是 INT_MAX + 1 :结果是 INT_MIN。
(2)最严重的上溢是 INT_MAX + INT_MAX :结果是 -2。
(3)最轻微的下溢是 INT_MIN - 1 :结果是 INT_MAX。
(4)最严重的下溢是 INT_MIN +INT_MIN :结果是 0。

应付溢出的最佳方法就是防范于未然:充分了解数据的范围,选择恰当的变量类型。

posted @ 2014-10-29 22:43  yyxayz  阅读(315)  评论(0编辑  收藏  举报