【C语言】atoi的模拟实现

一、前言:

在模拟实现atoi函数前,我们要了解atoi的使用

 atoi函数是将数字字符串转换为对应的数字,比如输入字符串“-123”,打印出整型数字-123

 二、思路分析:

我们要思考传来的字符串是什么样子?(注意:我们主要实现一些常规得字符串,不要思考一些稀奇古怪的字符串形式,不然这个库函数的实现该没完没了了)

1.空字符串atoi("")

2.空指针atoi(NULL)

3.带有空格的数字字符串atoi("    123")

4.字符串中不仅有数字还有字母atoi("123abc")

5.非常大的数字字符串(数字字符串超出整数的表示范围)atoi("11111111111111111111111111")

  • 当传过来的参数是空字符串和空指针的时候我们应该返回什么呢,atoi的返回类型int类型,我们应该返回0吗?但是如果我们传过来的就是“0”呢,这时我们应该创建一个枚举类型

如果合法,我们就返回一个合法的0,如果不合法,我们就返回一个不合法的0,由于合法的传参是少数,不合法传参是多数,我们创建一个全局的枚举类型变量,将值置为不合法,当是合法的数时,我们再将它置为合法

  • 处理数字字符:我们要将数字字符转换为数字,需要得到有正负的十进制数字,并且判断它的合法性

1.怎么样将数字字符转换为数字?

将数字字符-字符‘0’=数字

2.将数字转换为十进制数字

创建一个新的变量ret,让ret等于ret*10后再加上当前的数字

3.怎么得到正负?

再处理数字字符前,我们如果遇到'+',flag=1;,遇到‘-’,flag=-1; ,将flag乘到ret中

4.判断合法性

ret要用long long类型,atoi返回的是int类型,传来的数字必须是整型范围内的,此时的ret要能存放超出int类型的范围的数字,所以ret要用long long类型

三、具体实现:

enum Status
{
	VALID,
	INVALID,
};
enum Status status = INVALID;
int my_atoi(const char* str)
{
	
	if (str == NULL)
	{
		return 0;
	}
	if (*str == '\0')
	{
		return 0;
	}
	//判断空白字符
	while (isspace(*str))
	{
		str++;
	}
	//判断是正数还是负数
	long long ret = 0;
	int flag = 1;
	if (*str == '+')
	{
		flag = 1;
		str++;
	}
	else if (*str == '-')
	{
		flag = -1;
		str++;
	}
	//处理数字字符
	//判读是否是数字字符
	while (isdigit(*str))
	{
		ret = ret * 10 + flag * (*str - '0');
		//判断越界
		if (ret<INT_MIN || ret>INT_MAX)
		{
			return 0;
		}
		str++;
	}
	if (*str == '\0')
	{
		status = VALID;
		return (int)ret;
	}
	else
	{
		return (int)ret;
	}

}
int main()
{
	int ret = my_atoi("123");
	if (status == INVALID)
	{
		printf("非法转换:%d\n", ret);
	}
	else
	{
		printf("合法转换:%d\n", ret);
	}
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值