面试题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 == '\0') 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 == '\0') 22 return 0; 23 } 24 else if (*pData == '-') 25 { 26 isNegative = true; 27 pData++; 28 //不合法情形3:内容为- 29 if (*pData == '\0') 30 return 0; 31 } 32 33 long long num = 0; //设为long long检查越界 34 while (*pData != '\0') 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 == '\0') 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 == '\0') 25 return 0; 26 } 27 else if (*pData == '-') 28 { 29 isNegative = true; 30 pData++; 31 //不合法情形3:内容为- 32 if (*pData == '\0') 33 return 0; 34 } 35 36 long long num = 0; //设为long long检查越界 37 while (*pData != '\0') 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 }
itoa实现,最后别忘加='\0'
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 = '\0'; 19 }
 
                    
                 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号