题目:输入一个表示整数的字符串,把该字符串转换成整数并输出。
例如输入字符串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 }
再给出一些测试结果:
正常普通整数字符串:
正常边界整数字符串:
正常但超出处理范围的整数字符串:
不是标准整数字符串的字符串:
空字符串: