ldjhust

工欲善其事 必先利其器

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

题目:输入一个表示整数的字符串,把该字符串转换成整数并输出。
例如输入字符串345,则输出整数345。

 

思路:在这里我们只考虑int型所能表示的范围内的整数,即[-2147483648, 2147483647),超过这个范围的我们不做处理,其实思路都一样,只是代码需要稍作修改。这道题考的就是细心,所有的方面都要考虑到(溢出、空字符串、正负号、包含不是数字字符的字符串)。

  代码有注释,这里就不做过多解释:

PS:代码略微有些长

  1 int StringToInt(const char *Str)
  2 {
  3     assert (Str != NULL);
  4 
  5     if ('\0' == *Str)
  6     {
  7         printf ("空字符串!\n");
  8         exit (1);
  9     }
 10 
 11     // 这里我们只处理int型范围内的整数,并且是32位的机器
 12     // ,即若这个字符串转换成整数在区间[-2147483648 ~ 2147483647)之内
 13     // ,超出这个范围内的整数字符串我们不做处理
 14     const char *MIN_INT = "-2147483648";
 15     const int MIN_LEN = 11;
 16 
 17     const char *MAX_INT = "2147483647";
 18     const int MAX_LEN = 10;
 19 
 20     // 首先判断待处理的字符串是否在我们处理的范围之内
 21     if ('-' == Str[0])
 22     {
 23         // 如果字符串的位数超过了MIN_INT的位数,则不用比较,肯定超过int的范围
 24         if (MIN_LEN < strlen (Str))
 25         {
 26             printf ("这个字符串表示的整数超出了int型整数的范围!\n");
 27             exit (1);
 28         }
 29 
 30         // 小于的肯定可以表示,等于的需要做进一步判断
 31         if (MIN_LEN == strlen (Str))
 32         {
 33             // 负数必须大于或等于int型所能表示的最小负数
 34             // , 从字符串的角度来看就是必须小于或等于MIN_INT这个字符串
 35             if (strcmp (Str, MIN_INT) > 0)
 36             {
 37                 printf ("这个字符串表示的整数超出了int型整数的范围!\n");
 38                 exit (1); // 在C中的头文件是stdlib.h
 39             }
 40         }
 41     }
 42     else if ('+' == Str[0])
 43     {
 44         if (MAX_LEN < strlen (Str + 1))
 45         {
 46             printf ("这个字符串表示的整数超出了int型整数的范围!\n");
 47             exit (1);
 48         }
 49 
 50         if (MAX_LEN == strlen (Str))
 51         {
 52             // 带符号的正数
 53             // 正数必须小于或等于int型所能表示的最大整数
 54             // , 从字符串的角度来看就是必须小于或等于MAX_INT这个字符串
 55             if (strcmp (Str + 1, MAX_INT) > 0)
 56             {
 57                 printf ("这个字符串表示的整数超出了int型整数的范围!\n");
 58                 exit (1);
 59             }
 60         }
 61     }
 62     else
 63     {
 64         if (MAX_LEN < strlen (Str))
 65         {
 66             printf ("这个字符串表示的整数超出了int型整数的范围!\n");
 67             exit (1);
 68         }
 69 
 70         if (MAX_LEN == strlen (Str))
 71         {
 72             // 不带符号的正数
 73             // 同理
 74             if (strcmp (Str, MAX_INT) > 0)
 75             {
 76                 printf ("这个字符串表示的整数超出了int型整数的范围!\n");
 77                 exit (1);
 78             }
 79         }
 80     }
 81 
 82     // 判断整数的符号
 83     bool bSign = true;
 84 
 85     if ('-' == Str[0])
 86     {
 87         bSign = false;
 88 
 89         // 跳过符号位
 90         ++Str;
 91     }
 92 
 93     if ('+' == Str[0])
 94     {
 95         bSign = true;
 96         ++Str;
 97     }
 98 
 99     int nResult = 0;
100 
101     while (*Str != '\0')
102     {
103         if ((*Str >= '0') && (*Str <= '9'))
104         {
105             nResult *= 10;
106 
107             // 加0是为了让其产生整型提升
108             nResult += *Str - '0' + 0;
109 
110             ++Str;
111         }
112         else
113         {
114             printf ("这个字符串不是一个标准的整数字符串!\n");
115             exit (1);
116         }
117     }
118 
119     return (bSign ? nResult : (-1 * nResult));
120 }

  再给出一些测试结果:

正常普通整数字符串:

  

正常边界整数字符串:

正常但超出处理范围的整数字符串:

不是标准整数字符串的字符串:

空字符串:

 

posted on 2013-05-02 16:58  ldjhust  阅读(692)  评论(0编辑  收藏  举报