zoukankan      html  css  js  c++  java
  • 将整数字符串转换成整数

    题目:输入一个表示整数的字符串,把该字符串转换成整数并输出。
    例如输入字符串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 }

      再给出一些测试结果:

    正常普通整数字符串:

      

    正常边界整数字符串:

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

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

    空字符串:

  • 相关阅读:
    获取图片的大小(宽高):BytesIO
    python中url解析 or url的base64编码
    [extjs5学习笔记]第三十七节 Extjs6预览版都有神马新东西
    【翻译】Ext JS 6早期访问版本发布
    【翻译】Ext JS 6有什么新东西?
    【Java二十周年】Delphi转行java的一些小感触
    Cursor类取出数据
    通过服务修改widgetUI
    安卓笔记--Style的继承
    [ExtJS5学习笔记]第三十六节 报表组件mzPivotGrid
  • 原文地址:https://www.cnblogs.com/ldjhust/p/3054949.html
Copyright © 2011-2022 走看看