[C语言] atoi函数的功能和模拟实现

本文详细解析了C语言中atoi函数的工作原理,包括处理空指针、空字符串、正负号、空格、数字字符识别以及溢出情况。作者还提供了自定义的模拟实现代码,展示了如何通过状态机和内置函数进行有效转换。
摘要由CSDN通过智能技术生成

1.atoi函数功能

我们能由图得知atoi的参数为一个字符串的地址,返回值为int;实际上atoi的函数功能就是将数字字符串转换为整数。下面就让给我们看看具体是怎么实现的。

atoi函数所使用的头文件是:#include <stdlib.h>

atoi函数使用案例:

如图我们看到atoi函数将字符串"123"转换成了数字123;那么若是数字前有符号的情况下怎么转换呢?我们接着看下一个例子

由此我们可以看出atoi函数是能够识别字符数字的正负从而转换。那么atoi函数遇到空格或者字母会发生什么呢?我们接着往下看。

由上述例子中我们可以得到下面几个结论:

1.atoi函数能够忽略字符串中一开始遇到的空格;

2.atoi函数如果先遇到字母字符就会返回0;

3.atoi函数一旦识别到数字后若遇到非数字就会直接返回;

2.atoi函数的模拟实现

对于atoi函数的模拟实现有这6个问题需要解决:

1.若函数传入的参数为空指针

2.若需要转换的字符串为空字符串""

3.如何忽略空格

4.如何确定正负

5.如何实现遇到数字字符转换成整型数字,遇到非数字字符返回

6.溢出问题(若该数字字符转换后大于INT_MAX或者T_MIN)

解决办法
1.空指针的问题可以用assert函数断言即可;使用assert函数需要包含#include <assert.h>

2.空字符串的第一个函数为'\0',所以只需要判断字符串第一个函数是否为'\0'返回即可

这里存在非法转换和合法转换,遇到字符串末尾为合法转换;非法转换很多,例如遇到字母字符;可以使用枚举解决,创建一个枚举类型初始化为非法,因为非法情况比较多,而合法情况就一种

3.忽略空格即要跳过所有空格,我们需要用到isspace函数,这里简单介绍一下该函数

该函数使用来判断是否为空格,该函数参数若为空格则返回非0,参数若为非空格则返回0;所以我们用一个while循环并使用该函数就能轻松解决第三个问题;使用isspace函数需要包含

#include <ctype.h>

4.我们定义一个flag变量,若遇到'+'为1,遇到'-'为-1

5.第5个问题我们需要用到isdigit函数,同样这里简单介绍一下该函数

该函数用来判断是否是数字字符,若是数字字符'0'到'9'返回非0,若不是数字字符返回0;使用isdigit函数需要包含#include <ctype.h>

当是数字字符时,将其减去'0'即转换为数字,再继续判断下个字符,若是非数字字符则直接返回

6.当所得值大于最大整型或者小于最小整型时,就返回最大整型或者最小整型。

话不多说,具体代码实现如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
#include <ctype.h>
#include <limits.h>
enum State
{
	VAILD,//合法的
	INVAILD//非法的
}state = INVAILD;
int my_atoi(const char*str)
{
	assert(str);//防止str为空指针
	if (*str == '\0')//遇到空指针直接返回0
	{
		return 0;
	}
	while (isspace(*str))//若跳过字符串开始可能出现的空格
	{
		str++;
	}
	int flag = 1;
	if (*str == '-')//如果出现符号位-,则flag为-1;
	{
		flag = -1;
		str++;
	}
	else if (*str == '+')
	{
		flag = 1;
		str++;
	}
	long long ret = 0;
	while (*str != '\0')//遇到数字字符转换成整型数字,遇到非数字字符返回
	{
		if (isdigit(*str))
		{
			ret = 10 * ret + (*str - '0') * flag;
			if (ret >= INT_MAX)
			{
				ret = INT_MAX;
				break;
			}
			else if (ret <= INT_MIN)
			{
				ret = INT_MIN;
				break;
			}
		}
		else
		{
				return (int)ret;
		}
		str++;
	}
	if (*str == '\0')
	{
		state = VAILD;
	}
		return (int)ret;
}
int main()
{
	int ret = my_atoi("2111111111111111");
	if (state == VAILD)
	{
		printf("合法转换");
	}
	else
	{
		printf("非法转换");
	}
	printf("%d", ret);
	return 0;
}

码字不易,期待你的点赞,评论和收藏!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值