【C语言进阶】atoi函数的模拟实现【C的深度解剖】超详细的解释和注释
【C语言进阶】atoi
函数的模拟实现【C的深度解剖】超详细的解释和注释
那么这里博主先安利一下一些干货满满的专栏啦!
作者: #西城s
这是我的主页:#西城s
在食用这篇博客之前,博主在这里介绍一下其它高质量的编程学习栏目:
数据结构专栏:数据结构 这里包含了博主很多的数据结构学习上的总结,每一篇都是超级用心编写的,有兴趣的伙伴们都支持一下吧!
算法专栏:算法 这里可以说是博主的刷题历程,里面总结了一些经典的力扣上的题目,和算法实现的总结,对考试和竞赛都是很有帮助的!
力扣刷题专栏:Leetcode想要冲击ACM、蓝桥杯或者大学生程序设计竞赛的伙伴,这里面都是博主的刷题记录,希望对你们有帮助!
C的深度解剖专栏:C语言的深度解剖想要深度学习C语言里面所蕴含的各种智慧,各种功能的底层实现的初学者们,相信这个专栏对你们会有帮助的!
今天,博主带着大家,一步一步,详细地解剖atoi(字符串转整型)这个函数。
本篇为不收藏必后悔系列篇~
atoi()
函数原型以及功能介绍
函数原型:
int atoi (const char * str);
函数功能: 将一个字符串转化成一个整型。
使用举例:
所需包含头文件:#include<stdlib.h>
实现思路
看到这里,很多伙伴都会觉得这个函数的实现十分简单:提取每一位,字符转整型就可以了
,其实不然。因为我们传进去的字符串是很多样的,我们有非常多的情况需要考虑。
需要考虑的问题:
- 空指针问题
- 空字符串问题
- 非数字字符
- 空白字符,逗号字符等
- 正负号
这里其实知识一部分,其实,我们通过www.cplusplus.com搜索这个函数,也就是上面那张原型图我们可知,还有许多问题要处理,博主今天就带着大家处理以上五个问题。细节方面我们看代码注释就可以了,已经十分详细了,如果还有不明白的地方,可以私信博主噢。
实现代码
//模拟实现atoi
//将字符串转化成整型
#if 1
#include<assert.h>
enum Status {
VALID,INVALID
}status=INVALID;//先一开始设置成非法
int my_atoi(const char* str) {
//空指针
assert(str);
int flag = 1;//表示是正数
//空字符串
if (*str == '\0') {
//发现这样返回无论怎样都不合适,所以我们设置一个变量
//判断当前返回值是否有效,合法还是非法
//使用枚举
return 0;
}
//处理空白字符
while (isspace(*str)) {
//如果是空白字符,就跳过去了
str++;
}
//正负号
if (*str == '-') {
flag = -flag;//有一个'-'变一次号
str++;
}
//遍历串
long long n = 0;
while (*str) {
if (isdigit(*str)) {
n = n * 10 + (flag) * (*str - '0');
if (n<INT_MIN || n>INT_MAX) {//说明越界了
//但是,如果存到n里面去,是肯定不会越界的,因为会发生截断
//所以,设置成long long是最好的
n = 0;
break;
}
}
else {
n = 0;
break;
}
str++;
}
if (*str == '\0') {
status = VALID;
}
return (int)n;
}
//1.空指针问题
//2.空字符串问题
//3.非数字字符
//4.空白字符等,逗号字符
//5.正负号
int main() {
while (1) {//重复测试
char arr[100] = { 0 };
gets(arr);
int ret = my_atoi(arr);
if (status == VALID)
printf("%d\n", ret);
else
printf("%d err\n", ret);
}
return 0;
}
#endif
尾声
相信看到这里,大家已经对atoi()
函数的模拟实现已经有了一定了解了,如果你感觉这篇博客对你有帮助的话,不要忘了一键三连支持一下再离开噢!