今天瞎逛论坛,看到一个很不错的题目,拿来练练手,记录一下,以便日后回看。
先看题目:
输入一个表示整数的字符串,把该字符串转换成整数并输出,例如输入字符串"345", 则输出整数 345。
给定函数原型 int StrToInt(const char *str) ,完成函数 StrToInt,实现字符串转换成整数的功能,不得用库函数 atoi(即便准许使用,其对于溢出情况的处理也达不到题目的要求.)
输入: 输出:
123 123
-123 -123
23a4 23
2147483648 2147483647
-2147483649 -2147483648
10522545459 2147483647
题目分析:
初看这套题貌似很简单,但是真正开始动手敲键盘的时候才发现里面有太多的陷阱。
陷阱一:是否考虑到了正负号的问,即代码能正确处理123与-123
陷阱二:是否考虑到字符串中有非法字符,例如23a4,该如何处理。我们目前假设输出23是正确的
陷阱三:如果输入的字符串超出了int型整数所能表示的最大范围怎么办?例如输入10522545459,我们知道int型最大范围为-2147483648~2147483647。我们假设一旦溢出时,输出最大 或最小数。在写代码过程中,溢出问题是最大的障碍。
陷阱四:字符串是空怎么办?默认字符串为空是输出0.
OK,将以上陷阱考虑清楚以后开始写代码了
1 #include <iostream> 2 #include <string.h> 3 #include <limits> 4 #include <limits.h> 5 using namespace std; 6 7 const int MAXSIZE=1000; 8 enum Status{ kValid = 0, kInvalid}; 9 int g_nStatus = kValid; 10 11 /*版本一 12 此版本基本实现了将字符串型整数转换为int整数,但是对于一些非法的输入依旧是不行的 13 例如:23a4,它只会返回0,而不是23;还有一旦越界后,它也是输出的0 14 */ 15 int StrToInt( const char* str ) 16 { 17 g_nStatus = kInvalid; 18 long long num=0; 19 20 if( str != NULL ) 21 { 22 const char* digit = str; 23 bool minus = false; 24 25 if( *digit == '+' ) 26 { 27 digit++; 28 } 29 else if( *digit == '-' ) 30 { 31 digit++; 32 minus=true; 33 } 34 35 while( *digit != '