0
点赞
收藏
分享

微信扫一扫

【C语言进阶】atoi函数的模拟实现【C的深度解剖】超详细的解释和注释

毅会 2022-04-14 阅读 58

【C语言进阶】atoi函数的模拟实现【C的深度解剖】超详细的解释和注释

那么这里博主先安利一下一些干货满满的专栏啦!

今天,博主带着大家,一步一步,详细地解剖atoi(字符串转整型)这个函数。

文章目录

atoi()函数原型以及功能介绍

使用举例:
所需包含头文件:#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()函数的模拟实现已经有了一定了解了,如果你感觉这篇博客对你有帮助的话,不要忘了一键三连支持一下再离开噢!

举报

相关推荐

0 条评论