• 面试题49:把字符串转换成整数(atoi)


    需要考虑的问题都已在程序中注释

     1 bool isValid;
     2 
     3 int StrToInt(const char* str)
     4 {
     5     isValid = false;
     6     //不合法情形1:空指针
     7     if (str == NULL)    
     8         return 0;
     9     
    10     //不合法情形2:内容为“”
    11     if (*str == '')
    12         return 0;
    13 
    14     const char *pData = str;
    15     bool isNegative = false;
    16     if (*pData == '+')
    17     {
    18         isNegative = false;    //是否是负数
    19         pData++;
    20         //不合法情形3:内容为+
    21         if (*pData == '')
    22             return 0;
    23     }    
    24     else if (*pData == '-')
    25     {
    26         isNegative = true;
    27         pData++;
    28         //不合法情形3:内容为-
    29         if (*pData == '')
    30             return 0;
    31     }
    32         
    33     long long num = 0;    //设为long long检查越界
    34     while (*pData != '')
    35     {
    36         //不合法情形5:存在非数字
    37         if (*pData < '0' || *pData > '9')
    38             return 0;
    39         else
    40         {
    41             num = num * 10 + (*pData - '0');
    42         }
    43         pData++;
    44     }
    45 
    46     //不合法情形6:越界
    47     num = isNegative ? 0 - num : num;
    48     //注意一定要加(signed int)
    49     if (isNegative && num < (signed int)0x80000000 || !isNegative && num > 0x7FFFFFFF)
    50         return 0;
    51 
    52     isValid = true;
    53     return num;
    54 }

    带测试的完整代码:

      1 #include<iostream>
      2 using namespace std;
      3 
      4 bool isValid;
      5 
      6 int StrToInt(const char* str)
      7 {
      8     isValid = false;
      9     //不合法情形1:空指针
     10     if (str == NULL)    
     11         return 0;
     12     
     13     //不合法情形2:内容为“”
     14     if (*str == '')
     15         return 0;
     16 
     17     const char *pData = str;
     18     bool isNegative = false;
     19     if (*pData == '+')
     20     {
     21         isNegative = false;    //是否是负数
     22         pData++;
     23         //不合法情形3:内容为+
     24         if (*pData == '')
     25             return 0;
     26     }    
     27     else if (*pData == '-')
     28     {
     29         isNegative = true;
     30         pData++;
     31         //不合法情形3:内容为-
     32         if (*pData == '')
     33             return 0;
     34     }
     35         
     36     long long num = 0;    //设为long long检查越界
     37     while (*pData != '')
     38     {
     39         //不合法情形5:存在非数字
     40         if (*pData < '0' || *pData > '9')
     41             return 0;
     42         else
     43         {
     44             num = num * 10 + (*pData - '0');
     45         }
     46         pData++;
     47     }
     48 
     49     //不合法情形6:越界
     50     num = isNegative ? 0 - num : num;
     51     //注意一定要加(signed int)
     52     if (isNegative && num < (signed int)0x80000000 || !isNegative && num > 0x7FFFFFFF)
     53         return 0;
     54 
     55     isValid = true;
     56     return num;
     57 }
     58 
     59 void Test(const char *testNum)
     60 {
     61     int result = StrToInt(testNum);
     62     if (testNum == NULL)
     63     {
     64         cout << "char * is Null" << endl;
     65         cout << "input is not vaild" << endl;
     66         cout << endl;
     67         return;
     68     }    
     69     cout << "Test string is: " << testNum << endl;
     70     if (isValid)
     71         cout << result << endl;
     72     else
     73         cout << "input is not vaild" << endl;
     74     cout << endl;
     75     
     76 }
     77 
     78 int main()
     79 {
     80     Test(NULL);
     81 
     82     Test("");
     83 
     84     Test("123");
     85 
     86     Test("+123");
     87 
     88     Test("-123");
     89 
     90     Test("1a33");
     91 
     92     Test("+0");
     93 
     94     Test("-0");
     95 
     96     Test("+");
     97 
     98     Test("-");
     99     
    100     //有效的最大正整数, 0x7FFFFFFF
    101     Test("+2147483647");
    102 
    103     Test("-2147483647");
    104 
    105     Test("+2147483648");
    106 
    107     //有效的最小负整数, 0x80000000
    108     Test("-2147483648");
    109 
    110     Test("+2147483649");
    111 
    112     Test("-2147483649");
    113 
    114     system("pause");
    115 
    116     return 0;
    117 }
    View Code

    itoa实现,最后别忘加=''

     1 void itoa(int num, char *str)
     2 {
     3     int power = 1;
     4     int j = num;
     5 
     6     while (j / 10 != 0)
     7     {
     8         power *= 10;
     9         j /= 10;
    10     }
    11     
    12     while (num != 0)
    13     {
    14         *str++ = '0' + (num / power);
    15         num %= power;
    16         power /= 10;
    17     }
    18     *str = '';
    19 }
  • 相关阅读:
    php 面向对象编程实例 __construct 和 __destruct 区别
    php 数组 类对象 值传递 引用传递 区别
    WebHttpBinding.ReaderQuotas 无法设置或者无法点出来
    XP IE8 安装失败
    把XML保存为ANSI编码
    更新RDL文件中的数据集(DataSets)
    真实赛车3,FERRARI之魂不买FERRARI 599 GTO可以解锁顶点系列。
    [转]一大波“关于BUG的类型”的图片 + 一小波笑话
    sdk manager 代理,解决下载速度慢的问题
    错误 1 缺少编译器要求的成员“System.Runtime.CompilerServices.ExtensionAttrib
  • 原文地址:https://www.cnblogs.com/raichen/p/5692390.html
Copyright © 2020-2023  润新知