【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()函数的模拟实现已经有了一定了解了,如果你感觉这篇博客对你有帮助的话,不要忘了一键三连支持一下再离开噢!

posted @ 2022-04-14 12:28  背包Yu  阅读(60)  评论(0编辑  收藏  举报  来源