面试题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 }
原文地址:https://www.cnblogs.com/raichen/p/5692390.html