码迷,mamicode.com
首页 > 编程语言 > 详细

【字符串处理算法】字符串包含的算法设计及C代码实现【转】

时间:2017-08-22 00:41:09      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:atoi   原创   多个   gcc   sof   inux   内容   编译   程序   

转自:http://blog.csdn.net/zhouzhaoxiong1227/article/details/50679587

一、需求描述

输入一个由数字构成的字符串,编写程序将该字符串转换为整数并输出。

 

例如,如果输入的字符串是“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。

【字符串处理算法】字符串包含的算法设计及C代码实现【转】

标签:atoi   原创   多个   gcc   sof   inux   内容   编译   程序   

原文地址:http://www.cnblogs.com/sky-heaven/p/7407226.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!