转自: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。

【字符串处理算法】字符串包含的算法设计及C代码实现【转】的更多相关文章

  1. JavaScript验证字符串只能包含数字或者英文字符的代码实例

    验证字符串只能包含数字或者英文字符的代码实例:本章节分享一段代码实例,它实现了验证字符串内容是否只包含英文字符或者数字.代码实例如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...

  2. (转载)微软数据挖掘算法:Microsoft 线性回归分析算法(11)

    前言 此篇为微软系列挖掘算法的最后一篇了,完整该篇之后,微软在商业智能这块提供的一系列挖掘算法我们就算总结完成了,在此系列中涵盖了微软在商业智能(BI)模块系统所能提供的所有挖掘算法,当然此框架完全可 ...

  3. 【字符串处理算法】字符串包括的算法设计及C代码实现

    一.需求描写叙述 给定一个长字符串和一个短字符串.编敲代码推断短字符串中的全部字符是否都在长字符串中.假设是,则长字符串包括短字符串:反之,不包括. 为了尽量包括大多数情况,字符串中能够包括大写和小写 ...

  4. 算法练习LeetCode初级算法之字符串

    反转字符串 我的解法比较low,利用集合的工具类Collections.reverse反转,用时过长 class Solution { public void reverseString(char[] ...

  5. 【LeetCode算法】LeetCode初级算法——字符串

      在LeetCode初级算法的字符串专题中,共给出了九道题目,分别为:反转字符串,整数反转,字符串中的第一个唯一字符,有效的字母异位词,验证回文字符串,字符串转换整数,实现strStr(),报数,最 ...

  6. KMP替代算法——字符串Hash

    很久以前写的... 今天来谈谈一种用来替代KMP算法的奇葩算法--字符串Hash 例题:给你两个字符串p和s,求出p在s中出现的次数.(字符串长度小于等于1000000) 字符串的Hash 根据字面意 ...

  7. KMP算法字符串查找子串

    题目: 经典的KMP算法 分析: 和KMP算法对应的是BF算法,其中BF算法时间复杂度,最坏情况下可以达到O(n*m),而KMP算法的时间复杂度是O(n + m),所以,KMP算法效率高很多. 但是K ...

  8. 字符串匹配算法系列一:KMP算法原理

    本文主要参考了https://mp.weixin.qq.com/s/rbaPmBejID8-rYui35Snrg的表述,加上部分自己的理解 学习任何算法都要了解该算法解决什么问题?我们看看KMP算法主 ...

  9. LeetCode初级算法--字符串01:反转字符串

    LeetCode初级算法--字符串01:反转字符串 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...

  10. LeetCode初级算法--字符串02:字符串中的第一个唯一字符

    LeetCode初级算法--字符串02:字符串中的第一个唯一字符 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog. ...

随机推荐

  1. [剑指Offer] 58.对称的二叉树

    题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. [思路]递归,关键是isSame函数中的最后一句 /* struct Tree ...

  2. [计算机网络-应用层] P2P应用

    首先我们要先来区分一下下面的几种体系结构: CS:Client/Server 客户-服务器结构BS:Browser/Server  浏览器-服务器结构 P2P:Peer to Peer 对等结构 BS ...

  3. BIO、NIO、AIO通信机制

    一.BIO的理解 首先我们通过通信模型图来熟悉下BIO的服务端通信模型:采用BIO通信模型的服务端,通常由一个独立的Acceptor线程负责监听客户端的连接,它接收到客户端的连接请求之后为每个客户端创 ...

  4. matlab padarray

    功能:填充图像或填充数组 使用:B = padarray(A,padsize,padval,direction) A表示输入图像,B是填充后的图像,padsize给出了填充的行数和列数,通常用[r c ...

  5. Java中的缓冲流详解

    缓冲流增强了读写文件的能力,比如Student.txt是一个学生的名单,每个姓名占一行.如果我们想要读取名字,那么每次必须读取一行,使用FileReader流很难完成这样的任务,因为我们不清楚一行有多 ...

  6. Elasticsearch 中文分词器IK

    1.安装说明 https://github.com/medcl/elasticsearch-analysis-ik 2.release版本 https://github.com/medcl/elast ...

  7. [LOJ2538] [PKUWC2018] Slay the Spire

    题目链接 LOJ:https://loj.ac/problem/2538 Solution 计数好题. 首先可以发现这题和期望没关系. 其次对于手上的一套牌,设我们有\(a\)张强化牌,那么: 如果\ ...

  8. [GDOI2014]拯救莫莉斯 状压DP

    题面: 莫莉斯·乔是圣域里一个叱咤风云的人物,他凭借着自身超强的经济头脑,牢牢控制了圣域的石油市场. 圣域的地图可以看成是一个n*m的矩阵.每个整数坐标点(x , y)表示一座城市( 1\le x\l ...

  9. BZOJ1568:[JSOI2008]Blue Mary开公司——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=1568 李超线段树(不会的话去网上搜吧……). 完. #include<map> #in ...

  10. bzoj4390: [Usaco2015 dec]Max Flow(LCA+树上差分)

    题目大意:给出一棵树,n(n<=5w)个节点,k(k<=10w)次修改,每次给定s和t,把s到t的路径上的点权+1,问k次操作后最大点权. 对于每次修改,给s和t的点权+1,给lca(s, ...