p_string

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

标准库函数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》

posted on 2016-08-20 12:46  p_string  阅读(3396)  评论(0编辑  收藏  举报