【C语言】atoi函数的模拟实现

atoi函数的模拟实现(结尾附源代码)



一、atoi函数怎么用?

参考MSDN
在这里插入图片描述
这个意思就是将字符串转换为double(atof)、integer(atoi,_atoi64)或long(atol)
简单来说就是把字符串”1234“转换成1234

代码实现如下(示例):

//模拟实现atoi函数
//第一步:先实现一下atoi函数
int main()
{
	char arr[10] = "1234";
	int ret = atoi(arr);
	printf("%d\n", ret);
	return 0;
}

在这里插入图片描述
了解完atoi函数的使用之后就可以进行模拟实现!


二、初级atoi函数的模拟实现

代码如下(示例):

//模拟实现atoi函数
int my_atoi(const char* str)
{
	int n = 0;
	while (*str)
	{
		n = n * 10 + (*str) - '0';
		str++;
	}
	return n;
}
int main()
{
	char arr[10] = "1234";
	int ret = my_atoi(arr);
	printf("%d\n", ret);
	return 0;
}

在这里插入图片描述


三、高级atoi函数的模拟实现

我们在模拟实现atoi函数的时候会遇到很多问题,下面让我来给大家一 一列举!

1.判断空指针

我们应该用assert断言一下str指针,确保不是空指针!

2.字符串为空

如果字符串为空字符串!在这里插入图片描述,我们可以直接返回0

代码如下(示例):

//字符串为空
	if (*str == '\0')
	{
		return 0;
	}

3.空白字符

在这里插入图片描述,如果字符串前面有空格,就用isspace判断空格,并跳过空格所在的地址!(不要忘了头文件)

代码如下(示例):

	//空白字符
	while (isspace(*str))
	{
		str++;
	}

4.判断正负号

在这里插入图片描述,如果字符串里面有正负号的情况下,返回的也必须是正数或者负数!所以定义变量flag!

代码如下(示例):

    int flag=1;
	//判断正负号
	if (*str == '+')
	{
		flag = 1;
		str++;
	}
	else if (*str == '-')
	{
		flag = -1;
		str++;
	}
	n = n * 10 + flag * (*str - '0');
	str++;

5.不是数字

在这里插入图片描述,用isdigit判断数字,如果数组里面带有ab等字符返回0(不要忘了头文件)

代码如下(示例):

if (isdigit(*str))
	{
	   //......
	}
else//不是数字是字符
	{
		break;
	}
	str++;

6.数组越界

在这里插入图片描述,如果这个数字大于INT_MAX或者小于INT_MIN就会返回0

代码如下(示例):

if (n<INT_MIN || n> INT_MAX)
	{
		n = 0;
		break;
	}

7.返回值的判断

这里有两种情况,1.转换完数组中全部数字后的\0返回。2.各种错误及非法访问返回的0
两种\0要进行判断,我们需要创建一个enum枚举常量!

代码如下(示例):

enum Status
{
	VALID,  //0
	INVALID //1
}status = INVALID;

//正常的\0返回值判断
if (*str == '\0')
	{
		status = VALID;
	}

8.主函数中合法和非合法的判断

代码如下(示例):

if (status == VALID)
		printf("正常转化: %d\n", ret);
	else
		printf("非法转换: %d\n", ret);

9.不同问题的运行结果

在这里插入图片描述


四、atoi函数模拟实现代码

代码如下(示例):

#include<stdio.h>
#include<assert.h>
#include<ctype.h>
enum Status
{
	VALID,
	INVALID
}status = INVALID;

int my_atoi(const char* str)
{
	int flag = 1;
	//判断空指针
	assert(str);

	//字符串为空
	if (*str == '\0')
	{
		return 0;
	}

	//空白字符
	while (isspace(*str))
	{
		str++;
	}

	//判断正负号
	if (*str == '+')
	{
		flag = 1;
		str++;
	}
	else if (*str == '-')
	{
		flag = -1;
		str++;
	}

	long long n = 0;
	while (*str != '\0')
	{
		if (isdigit(*str))
		{
			n = n * 10 + flag * (*str - '0');
			if (n<INT_MIN || n> INT_MAX)
			{
				n = 0;
				break;
			}
		}
		else//不是数字是字符
		{
			break;
		}
		str++;
	}
	if (*str == '\0')
	{
		status = VALID;
	}
	return (int)n;
}

int main()
{
	char arr[100] = "123";
	int ret = my_atoi(arr);
	if (status == VALID)
		printf("正常转化: %d\n", ret);
	else
		printf("非法转换: %d\n", ret);
	return 0;
}

总结

例如:以上就是今天要讲的内容,本文介绍atoi函数的使用方法和模拟实现,大家以后接触一个函数之后也可以像这样来进行学习,如果我的博客对你有所帮助记得三连支持一下,感谢大家的支持!
在这里插入图片描述

  • 25
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值