转自:http://blog.csdn.net/zhouzhaoxiong1227/article/details/50679587
版权声明:本文为博主原创文章,对文章内容有任何意见或建议,欢迎与作者单独交流,作者QQ(微信):245924426。
一、需求描述
输入一个由数字构成的字符串,编写程序将该字符串转换为整数并输出。
例如,如果输入的字符串是“12345”,那么输出的整数是12345。注意,不要使用C语言的库函数atoi。
二、算法设计
我们都知道,如果给定一个整数123,那么其表示方法是:123=1*100+2*10+3。也就是说,一个整数是由其各位上的数字按照位数求和组成的。
因此,这个需求的解决方法很简单,只要将字符串中的各位数字按照其位数相加就行了。在此过程中,要考虑一些特殊情况。
程序的总体流程如图1所示。
图1 程序的总体流程
三、特殊流程考虑
在编写程序的过程中,我们要对输入的数字串的长度及格式多做考虑,如:
1.如果输入的字符串中包含了除数字之外的其它字符,那么程序直接返回,不进行后续处理。
2.如果数字串是以一个或多个字符0开头的,则要先将其去掉之后再进行后续处理。
3.因为在c语言中,整型(int)所能表示的最大数为2147483647,所以如果输入的数字串大于了“2147483647”,那么程序直接返回,不进行后续处理。
四、程序代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 |
/********************************************************************** * 版权所有 (C)2016, Zhou Zhaoxiong。 * * 文件名称: StrToInt.c * 文件标识: 无 * 内容摘要: 将字符串转换为整数 * 其它说明: 例如, 将"123"转换为123 * 当前版本: V1.0 * 作 者: Zhou Zhaoxiong * 完成日期: 20160218 * **********************************************************************/ #include <stdio.h> #include <limits.h> // 由于在代码中使用了INT_MAX, 因此要包含该头文件 // 重新定义数据类型 typedef signed char INT8; typedef int INT32; typedef unsigned int UINT32; // 函数声明 INT32 CalIntVal(INT32 iBitLen); INT32 JudgeIfOverFlow(INT8 *pszTestStr); /********************************************************************** * 功能描述: 主函数 * 输入参数: 无 * 输出参数: 无 * 返 回 值: 0-执行成功 其它-执行失败 * 其它说明: 无 * 修改日期 版本号 修改人 修改内容 * --------------------------------------------------------------------- * 20160218 V1.0 Zhou Zhaoxiong 创建 ***********************************************************************/ INT32 main() { INT8 szInputStr[100] = {0}; INT8 szTestStr[100] = {0}; INT32 iResultInt = 0; // 转换之后的整数最大支持2147483647 UINT32 iPosFlag = 0; UINT32 iTestStrLen = 0; UINT32 iBitVal = 0; INT32 iRetVal = 0; printf("Max value of int is %d\n", INT_MAX); // 求出int的最大值 printf("Please input the string: \n"); scanf("%s", szInputStr); printf("InputStr=%s\n", szInputStr); // 判断输入的字符串中是否有除数字之外的其它字符, 若有, 则直接退出 for (iPosFlag = 0; iPosFlag < strlen(szInputStr); iPosFlag ++) { if (szInputStr[iPosFlag] < ‘0‘ || szInputStr[iPosFlag] > ‘9‘) { printf("%s is not a digital string, please check!\n", szInputStr); return -1; } } // 如果字符串前面有字符0, 则将其去掉 iPosFlag = 0; while (szInputStr[iPosFlag] == ‘0‘) { iPosFlag ++; } // 获取去除0之后的字符串值 strncpy(szTestStr, szInputStr+iPosFlag, strlen(szInputStr)-iPosFlag); // 判断字符串是否大于2147483647, 若是, 则直接退出 iRetVal = JudgeIfOverFlow(szTestStr); if (iRetVal != 0) { printf("%s is bigger than INT_MAX(2147483647), please check!\n", szTestStr); return -1; } // 计算字符串对应的整数值 iTestStrLen = strlen(szTestStr); iResultInt = 0; for (iPosFlag = 0; iPosFlag < iTestStrLen; iPosFlag ++) { iBitVal = szTestStr[iPosFlag] - ‘0‘; // 计算每一位对应的数字 iResultInt = iResultInt + iBitVal * CalIntVal(iTestStrLen-iPosFlag); } printf("ResultInt=%d\n", iResultInt); return 0; } /********************************************************************** * 功能描述: 判断输入的字符串是否溢出 * 输入参数: pszTestStr-测试字符串 * 输出参数: 无 * 返 回 值: 1-溢出 0-未溢出 * 其它说明: 判断字符串是否大于2147483647, 若是, 则溢出 * 修改日期 版本号 修改人 修改内容 * --------------------------------------------------------------- * 20160218 V1.0 Zhou Zhaoxiong 创建 ***********************************************************************/ INT32 JudgeIfOverFlow(INT8 *pszTestStr) { UINT32 iTestStrLen = 0; INT8 szProcessedStr[100] = {0}; INT8 szMaxValOfInt[100] = {0}; snprintf(szMaxValOfInt, sizeof(szMaxValOfInt)-1, "%d", INT_MAX); // 求出int的最大值 iTestStrLen = strlen(pszTestStr); if (iTestStrLen > strlen(szMaxValOfInt)) // 长度超过 { return 1; } else if (iTestStrLen == strlen(szMaxValOfInt)) // 长度相等 { if (strcmp(pszTestStr, szMaxValOfInt) > 0) // 溢出 { return 1; } else { return 0; } } else // 测试字符串长度小于"2147483647"的长度, 未溢出 { return 0; } } /********************************************************************** * 功能描述: 求字符串中的每一位所对应的整数值 * 输入参数: iBitLen-对应整数的第多少位 * 输出参数: 无 * 返 回 值: 该位所对应的整数值 * 其它说明: 无 * 修改日期 版本号 修改人 修改内容 * --------------------------------------------------------------- * 20160218 V1.0 Zhou Zhaoxiong 创建 ***********************************************************************/ INT32 CalIntVal(INT32 iBitLen) { if (iBitLen == 1) // 个位 { return 1; } else { return 10 * CalIntVal(iBitLen-1); } } |
来自CODE的代码片
StrToInt.c
五、程序测试
我们将编写好的程序“StrToInt.c”上传到Linux机器,并使用“gcc -g -o StrToIntStrToInt.c”命令对该程序进行编译,生成“StrToInt”文件。下面对程序进行详细的测试。
1.输入字符串为“12345”时,程序运行情况如下:
Max value of int is 2147483647
Please input the string:
12345
InputStr=12345
ResultInt=12345
2.输入字符串为“-12345”时,程序运行情况如下:
Max value of int is 2147483647
Please input the string:
-12345
InputStr=-12345
-12345 is not a digital string, please check!
3.输入字符串为“123456a”时,程序运行情况如下:
Max value of int is 2147483647
Please input the string:
123456a
InputStr=123456a
123456a is not a digital string, please check!
4.输入字符串为“012345”时,程序运行情况如下:
Max value of int is 2147483647
Please input the string:
012345
InputStr=012345
ResultInt=12345
5.输入字符串为“0123450”时,程序运行情况如下:
Max value of int is 2147483647
Please input the string:
0123450
InputStr=0123450
ResultInt=123450
6.输入字符串为“2147483647”时,程序运行情况如下:
Max value of int is 2147483647
Please input the string:
2147483647
InputStr=2147483647
ResultInt=2147483647
7.输入字符串为“2147483648”时,程序运行情况如下:
Max value of int is 2147483647
Please input the string:
2147483648
InputStr=2147483648
2147483648 is bigger than INT_MAX(2147483647), please check!
8.输入字符串为“123456789012”时,程序运行情况如下:
Max value of int is 2147483647
Please input the string:
123456789012
InputStr=123456789012
123456789012 is bigger than INT_MAX(2147483647), please check!
可见,对于上面考虑到的几种特殊情况,程序均能做出正确的处理。
六、需求扩展
基于本文中的需求和程序,我们可考虑对需求进行以下扩展:
1.不限制输入的字符串中只能包含数字,也可以在开头包含“+”或“-”。如果字符串是以“+”开头,那么最后输出的整数是正整数;如果字符串是以“-”开头,那么最后输出的整数是负整数。
2.如果输入的数字串大于了“2147483647”,那么程序直接输出整数值为2147483647。