【C语言】深度讲解 atoi函数 使用方法与模拟实现

文章目录

  • atoi
  • 使用方法:
  • atoi模拟实现

atoi

功能:转化字符串到整数
头文件: #include

int atoi (const char * str);

参数 str:要转换为整数的字符串

返回值

如果转换成功,函数将转换后的整数作为int值返回 , 如果没有执行有效的转换,则返回零。

注意事项

字符串只能转换数字,如字符串包含了数字以外的,则提前返回非数字前的字串

使用方法:

#include
#include
int main()
{
	char arr[] = "123";
	int ret = atoi(arr);
	if (ret == 0)
	{
		printf("转换失败\n");
	}
	else
	{
		printf("整型值值= %d\n整型值乘2= %d\n", ret, ret * 2);
	}
	system("pause");
	return 0;
}

最终输出结果为:

整型值 = 123
整型值乘2= 246


atoi模拟实现

注意事项:

  • 判断atoi传过来的参数是否为空指针
  • 判断首字符是否为空格,如有空格将跳过
  • 判断字符串是否为空
  • 判断字串正负
  • 判断是否为数字,如是非数字提前返回非数字前的字串
  • 考虑字串是否为溢出的问题 (大于int或小于int)
  • 判断字串是否非法转换(用一个枚举来判断,起始把字符串判定为非法转换,如转换成功在判定成 成功转换)
#include   
#include
#include
#include
enum S
{
	Value,
	ErrValue //代表非法转换
};
S = ErrValue;
int my_atoi(char* arr)
{
	//1:判断是否为空指针
	assert(arr);

	//2:判断是否为空格
	while (*arr == ' ')
	{
		arr++;
	}

	//判断字符串是否为空
	if (*arr == '\0')
		return 0;

	//判断正负 flag 为1是正 -1是付
	int flag = 1;
	if (*arr == '-')
	{
		flag = -1;
		arr++;
	}

	//首字符是否为数字 如果不是数字 就返回0
	if (!isdigit(*arr))
		return 0;

	//使用long long可以接受更长的长度
	long long n = 0;
	while (*arr != '\0')
	{
		//判断是否为数字
		//isdigit判断是否为十进制0-9的数字 头文件#include  
		if (isdigit(*arr)) 
		{
			n = n * 10 + (*arr - '0');
			//考虑是否为溢出的问题
			if (n > INT_MAX)
			{
				n = INT_MAX;
				break;
			}
			else if (n < INT_MIN)
			{
				n = INT_MIN;
				break;
			}
		}
		//如果是非数字就退出并返回
		else
		{
			return (int)n;
		}
		arr++;
	}

	//flag决定 N是否为正
	n *= flag;

	//成功转换
	if (*arr == '\0')
	{
		S = Value;
		//返回值是int类型所以强制类型转换一下
		return (int)n;
	}

	//非法转换
	return (int)n;
}

int main()
{
	char arr[] = "123";
	int ret = my_atoi(arr);
	if (S == Value)
	{
		printf("成功转换\n");
		printf("整型值值= %d\n整型值乘2= %d\n", ret, ret * 2);
	}
	else
	{
		printf("非法转换\n");
		printf("整型值值= %d\n整型值乘2= %d\n", ret, ret * 2);
	}
	system("pause");
	return 0;
}

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