【C语言】atoi函数的模拟

atoi对于初学者来说大概率是一个陌生的函数
但不要害怕,我们可以通过各种网站去查询
例如:
cplusplus就是一个很好的查询网站

目录

  • 函数介绍
  • 模拟实现
    • 需要注意的点

函数介绍

【C语言】atoi函数的模拟_第1张图片
我们发现这是一个将字符串转换为整形数字的函数

例如:

int main()
{
	char str[] = "1234";
	int ret = atoi(str);
	printf("%d\n", ret);
	return 0;
}

【C语言】atoi函数的模拟_第2张图片
在遇到不同字符串会有不同处理方法:

  1. 该函数首先根据需要丢弃尽可能多的空白字符(如在isspace中),直到找到第一个非空白字符。

  2. 从这个字符开始,接受一个可选的初始加号或减号,后面跟着尽可能多的以10为基数的数字,并将它们解释为数值。

  3. 字符串可以在组成整数的字符之后包含其他字符,这些字符将被忽略,并且对此函数的行为没有影响。

  4. 如果str中的第一个非空白字符序列不是有效的整数,或者由于str为空或仅包含空白字符而不存在这样的序列,则不执行转换并返回零。

模拟实现

模拟实现时我们就可以根据不同的处理方法进行操作
注意:

因为当你输入一个“a”时,输出为0
当输入一个“0”时,同样为一个0
故需要进行判断是否为一个合法的或是非法的
可以运行enum进行判断

#include
#include
#include
#include
//atoi模拟
enum Judge
{
	VALID,
	INVALID
}judge=INVALID;

int my_atoi(char* str)
{

	assert(str);
	//判断指针是否为NULL
	int len = strlen(str);
	//判断是否为空字符串
	if (len == 0)
	{
		return 0;
	}
	//将空格跳过
	while (isspace(*str))
	{
		str++;
	}
	//进行正负号的判断,注意如果原字符串可能不带符号,故初始化为1
	int flag = 1;
	if (*str == '+')
	{
		flag = 1;
		//判断完正负号要进行++跳到下一个字符
		str++;
	}
	else if(*str == '-')
	{
		flag = -1;
		str++;
	}
	long long ret = 0;
	//注意溢出
	while (*str)
	{
		if (isdigit(*str))
		{
			ret = *str - '0' + ret * 10;
			//计算新的ret的值的式子
			if (ret > INT_MAX || ret < INT_MIN)
			//判断是否超出int的最大范围
			{
				if (flag == 1)
					return INT_MAX;
				else
					return INT_MIN;
			}
			str++;
		}
		else
			return flag * ret;

	}
	//运行到这时肯定是合法的
	judge = VALID;
	return flag * ret;
}

需要注意的点

  1. 我经常性的写数组时忘记带[],导致程序出错

  2. 在进行判别正负号时为了省事没有进行'-'判断,导致如果没有符号时程序出错

	if (*str == '+')
	{
		flag = 1;
		str++;
	}
	else
	{
		flag = -1;
		str++;
	}

欢迎纠错与改正

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