atoi函数功能以及模拟实现

目录

一,atoi函数的基本功能

1.1基本功能

1.2功能实现

二,模拟实现

2.1实现过程

2.2完整代码


一,atoi函数的基本功能

1.1基本功能

基本格式:int atoi(const char * str)

根据其基本格式,atoi函数的基本功能, 为将 str 指向的字符串转化为整形数。也就是将一个原先为一个包含整型数的字符串,将其内容中的整形数抠出来,单独返回,当然,既然是整形数,如果是负数,则会将符号也一起返回。

1.2功能实现

那么我们了解了其基本功能之后,我们通过一个例子观察该函数的功能:

#include
#include
int main()
{
	char* p = { "   +1234sbc" };
	int ret = atoi(p);
	printf("%d\n",ret);
	return 0;
}

如上代码所示,字符串 p 在经过 atoi 函数的转换之后,输出如下:

atoi函数功能以及模拟实现_第1张图片

我们看到,该函数只是将原字符串中的整形数转换了出来。当然,这里关于字符串可能会有很多种,所以可能会涉及到许多问题,那么我们通过接下来的模拟实现去更加仔细的去了解其实现原理。

二,模拟实现

那么首先,我们需要知道的是,对于字符串可能会有很多种,但是这里我们对于一些基本的。一般会用到的一些可能的字符串都做一个实现。

2.1实现过程

在整个分析之前,我们需要做的是,首先设置一个全局的枚举变量 state,然后将其初始值设置为非法的 INVALID,在之后,我们会将该值作为判断该字符串是否转换成功的标志。

正文如下:

首先,我们想到的是,如果 str 为空指针,此时可能会有问题,所以我们使用断言,来确定传递的指针不是空指针。

第二,如果指针不是空指针,而字符串的内容为空,此时我们认为这样是错误的,所以我们直接返回 0 ,表示这是异常返回。

第三,如果在我们要转换的整型数之前,有空格以及tab等符号的话,我们需要跳过这些字符,这里我们需要用到一个函数:isspace ,用以检测这些空格字符。实现如下图所示:

atoi函数功能以及模拟实现_第2张图片

第四,如果在整型数之前遇到了负号,我们是需要在转换的时候加上的,但是如果是正号,我们默认是不加的,也即跳过即可。实现如下图,这里我们用了一个标识 flag ,如果正好遇到符合,我们则将其值设置为 -1 ,其集体功能在后面会用到:

atoi函数功能以及模拟实现_第3张图片

第五,当我们了解了以上这些之后,接下来我们可能还会遇到不是整型数的字符,比如英文字母等,此时我们就需要使用一个函数,叫做整形数识别函数 isdigit ,该函数同 isspace 函数“一家”,都出自头文件 ctype.h 中。对于这两个函数来说,其参数均为指针类型,返回值均为整型。

第六,当然,不能忽略的是,如果字符串中可以转化出来的数是一个超过整型的数,那么我们认为其是不能转化的,所以也是错误的,故返回 0。到此为止,我们已经有两种情况需要返回 0 了。

这里我们将第五六条合起来作为一条,其实现如下所示:

atoi函数功能以及模拟实现_第4张图片

那么,我们看到,在 isdigit 函数检查完之后,如果是整型数,接下来我们又出现一条实现整型数的计算的语句,通过 *str 减去 0 的ASCII码值之后,我们得到是处于当前 str 位置上的整型数的十进制数值,然后再原先检索到的该整型数的符号乘在该数上,最后通过整条代码,将该整型数求出。

如果之后一旦求得该数超过了整型数的大小,则强制返回 0 ,表示错误。

如果不是,直到将该字符串访问完,则进入 else 语句,将 枚举类型的变量state 置为正确返回的值 VALID。

好的,那么当我们考虑了上述这些之后,对于该函数的基本使用是没有什么问题的了。当然,我们也有一些问题没有考虑,但是对于我们日常使用来说,已经足够,所以我们不再考虑其他的东西了。

2.2完整代码

#include
#include
#include
#include
enum State
{
	INVALID,//异常  0
	VALID//正常 1
};
enum State state = INVALID;
int my_atoi(const char *str)
{
    //1.指针为NULL
	assert(str);
    //2.字符串内容为空
	if (*str == '\0')
		return 0;//异常返回
    //3.空格等
	while (isspace(*str))
	{
		str++;
	}
	//4.正负号
	int flag = 1;
	while(*str == '+' || *str == '-')
	{
		if (*str == '+')
		{
			flag = 1;
			str++;
		}
		else
		{
			flag = -1;
			str++;
		}
	}
	//5.非数字字符
	//6.字符串转换后的数组超过了最大整型数
	long long ret = 0;
	while (*str)
	{
		if (isdigit(*str))
		{
			ret = ret * 10 + flag * (*str - '0');
			if (ret > INT_MAX || ret < INT_MIN)
			{
				return 0;//异常返回
			}
			str++;
		}
		else
		{
			state = VALID;//合法返回
			return (int)ret;
		}
	}
	state = VALID;//合法返回
	return (int)ret;
}
int main()
{
	char* p = {"	  -1234abc"};
	int ret = my_atoi(p);
	if (state == VALID)
	{
		printf("转换后的正确值为:%d\n",ret);
	}
	else
	{
		printf("错误\n");
	}
	return 0;
}

那么对于完整代码,我们还需要对其做一些解释:

这里我们大概有两种返回方式:

第一种,是返回 0 ,这里返回 0 的同时,其实我们并没有改变 state 的值,因为这种情况我们认为是错误的,所以,最后 state 的值依然是初始值,所以结果为:错误。

第二种,是返回正常转换后的整型值,同时会将原有 state 的值更改为正常返回的值 VALID。

好的,以上就是我们对于 atoi 的功能以及其内容的具体分析,如有错误,还请各位指正呀!

atoi函数功能以及模拟实现_第5张图片

你可能感兴趣的:(c语言,c语言,开发语言,后端)