【atoi函数的功能介绍及使用与模拟实现——超详细版本】

atoi函数的功能介绍及使用与模拟实现——超详细版本

1.cplusplus网站介绍

1.1atoi函数的功能介绍

【atoi函数的功能介绍及使用与模拟实现——超详细版本】_第1张图片

它的功能:
解析将其内容解释为整数的 C 字符串,该整数作为 类型的值返回。
该函数首先根据需要丢弃尽可能多的空格字符(如 ),直到找到第一个非空格字符。然后,从此字符开始,取一个可选的首字母加号或减号,后跟尽可能多的 10 进制数字,并将它们解释为数值。
字符串可以在构成整数的字符之后包含其他字符,这些字符将被忽略,并且对此函数的行为没有影响。
如果 中的第一个非空格字符序列不是有效的整数,或者由于为空或仅包含空格字符而不存在此类序列,则不执行转换并返回零。

【atoi函数的功能介绍及使用与模拟实现——超详细版本】_第2张图片
atoi函数功能是将数字字符串转换为整数;比如数字字符串"12345"被atoi转换为12345,数字字符串"-12345"被转换为-12345。

1.2返回值和接收数据类型介绍

【atoi函数的功能介绍及使用与模拟实现——超详细版本】_第3张图片

int atoi (const char * str);

返回类型是int整型,接收数据类型是字符串指针

1.3头文件️

【atoi函数的功能介绍及使用与模拟实现——超详细版本】_第4张图片

atoi函数所使用的头文件:#include

1.4atoi函数使用实例✍️

【atoi函数的功能介绍及使用与模拟实现——超详细版本】_第5张图片

**源码分享(需要自取)**


#include 
#include 
 
int main()
{
	char arr[100] = "12345";
	int ret = atoi(arr);
	printf("%d\n", ret);
	return 0;
}

2atoi函数模拟实现✍️

2.1初步模拟实现✍️

初步模拟实现可以把数字字符串转换为整数,由于没有考虑正负号,所以只能转换为正数;

还有很多特殊情况没有考虑,这里先来看看初步的模拟实现;

直接写还是比较麻烦的,这里先借助画图板来了解一下具体的思路:

【atoi函数的功能介绍及使用与模拟实现——超详细版本】_第6张图片

2.1.1代码实现

int my_atoi(const char* str)
{
	int n = 0;
	while (*str != '\0')
	{
		n = n * 10 + (*str - '0');
		str++;
	}
	return n;
}
int main()
{
	char arr[100] = "12345";
	int ret = my_atoi(arr);
	printf("%d\n", ret);
	return 0;
}

2.2atoi函数的具体实现(考虑6种特殊情况)

**特殊情况:**️

1.空指针
2.空字符串
3.字符串中的空格
4.非数字字符
5.溢出问题(所得数字大于INT_MAX或者小于INT_MIN)
6.正负号问题

**从哪方面考虑解决:**

1.空指针的问题很容易解决:使用assert函数断言即可;
2.空字符串的第一个元素即为’\0’,在前面判断是否为’\0’返回就可以了,但是有一个问题,返回的0时原字符是’0还是空字符串,这里存在非法转换和合法转换,可以使用枚举解决,创建一个枚举类型初始化为非法,因为非法的情况比较多,合法的情况就一种。初识化为非法有利于问题的解决,空字符串转换为整数0是一种非法转换。
3.当遇到字符串中有空格的时候,可以直接跳过空格所在的内容,指针++指向下一个字符
4.非数字字符,例如"123a456",这里在指针走到a的时候,直接返回123就行了,不需要继续往下走了,此时是一种非法转换
5.溢出问题是数字字符的一种情况,当所得的n的值大于最大整型或者小于最小整型的时候,返回最大整型或者最小整型,溢出问题是一种非法转换
6.正负号的问题可以找一个变量flag来记录,初始化为1,当是正数的时候flag的值不变为1
若字符串中有’-',flag的值变为-1,记录符号位。

2.2.1代码实现

#include
#include
#include
enum Status
{
	VALID,
	INVALID
}; status = INVALID;//使用枚举进行初始化为非法
int my_atoi(char* str)
{
	int flag = 1;//记录符号位
	1.空指针问题
	assert(str);
		
		2.空字符串问题
		if (*str == '\0')
		{
			return 0;
		}
		3.空格问题
		while (*str == ' ')
		{
			str++;
		}
		4.+-号问题
		if (*str == '+')
		{
			flag = 1;
			str++;
		}
		if (*str == '-')
		{
			flag = -1;
			str++;
		}
	
	long long n = 0;
	while (*str != '\0')
	{
		非数字字符问题
		if (isdigit(*str))//isdigit函数是检查字符串是否为十进制数字
		{
			n = n * 10 + (*str - '0');
			溢出问题
			if (n > INT_MAX)
			{
				return INT_MAX;
				break;
			}
			if (n < INT_MIN)
			{
				return INT_MIN;
				break;
			}
		}
		else
		{
			不是数字字符直接跳出循环,此时的status还是INVALID
			break;
		}
		str++;
	}
	此时已经走到'\0'处了
	if (*str == '\0')
	{
		status = VALID;//走到'\0'就是合法转换
	}
	n *= flag;
	return (int)n;//强制转换为整型类型返回
}

2.2.2实例应用举例✍️

#include
#include
#include
#include
enum Status
{
	VALID,
	INVALID
}; status = INVALID;//使用枚举进行初始化为非法
int my_atoi(char* str)
{
	int flag = 1;//记录符号位
	1.空指针问题
	assert(str);
		
		2.空字符串问题
		if (*str == '\0')
		{
			return 0;
		}
		3.空格问题
		while (*str == ' ')
		{
			str++;
		}
		4.+-号问题
		if (*str == '+')
		{
			flag = 1;
			str++;
		}
		if (*str == '-')
		{
			flag = -1;
			str++;
		}
	
	long long n = 0;
	while (*str != '\0')
	{
		非数字字符问题
		if (isdigit(*str))//isdigit函数是检查字符串是否为十进制数字
		{
			n = n * 10 + (*str - '0');
			溢出问题
			if (n > INT_MAX)
			{
				return INT_MAX;
				break;
			}
			if (n < INT_MIN)
			{
				return INT_MIN;
				break;
			}
		}
		else
		{
			不是数字字符直接跳出循环,此时的status还是INVALID
			break;
		}
		str++;
	}
	此时已经走到'\0'处了
	if (*str == '\0')
	{
		status = VALID;//走到'\0'就是合法转换
	}
	n *= flag;
	return (int)n;//强制转换为整型类型返回
}
int main()
{
	char* arr = "   -123a45";
	int ret = my_atoi(arr);
	if (status == VALID)
	{
		printf("合法转换: ret = %d\n", ret);
	}
	else
	{
		printf("非法转换: ret = %d\n", ret);
	}

	return 0;
}

运行结果展示

【atoi函数的功能介绍及使用与模拟实现——超详细版本】_第7张图片
制作不易,三连支持一下,可以吗(卑微版) !!!

【atoi函数的功能介绍及使用与模拟实现——超详细版本】_第8张图片

你可能感兴趣的:(C语言,#,函数,#指针,c语言,算法,库函数模拟实现)