【C语言】模拟实现atoi

功能

解析C字符串 将其内容解释为整数 该整数作为int类型返回【C语言】模拟实现atoi_第1张图片
函数接收一个char*类型的指针 返回类型是int

举例

【C语言】模拟实现atoi_第2张图片

#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int main()
{
	char* p = "58746";
	int ret = atoi(p);
	printf("%d", ret);
	return 0;
}

可以看到,atoi函数将字符串内容转化为整型数据

注意事项

我们在实现atoi函数时要考虑几个问题

  1. 因为参数部分是一个指针类型 所以我们就需要考虑空指针的问题
  2. 还要考虑如果传入的字符串是空字符串时 该怎么办
  3. 如果字符串前面有空格等空白字符怎么解决
  4. 如果字符串前有+/-等符号怎么处理
  5. 如果字符串过长怎么解决

接下来我们就实现atoi

模拟实现atoi

#include
#include
#include
#include
enum State
{
	VALID,
	INVALID
}state = INVALID;

int my_atoi(const char* p)
{
	assert(p);
	//断言指针的有效性 防止出现空指针
	if (*p == '\0')
	{
		return 0;
	}
	//如果字符串第一个字符就是\0,说明是空白字符串
	//直接返回0
	//但是为了防止与可能出现的情况字符串“0”转化过来也是0二者冲突
	//创建枚举类型来标注合法和非法 默认为非法
	//所以这里直接返回0 返回的是非法0 可以通过if语句判断
	while (isspace(*p))
	{
		p++;
	}
	//跳过空白字符 

	int flag = 1;
	if (*p == '+')
	{
		p++;
	}
	else if (*p == '-')
	{
		flag = -1;
		p++;
	}
	//判断正负数
	//如果前面没有符号默认为正数

	long long int ret = 0;
	//创建long long 类型增加储存的长度
	while (*p)
	{
		if (isdigit(*p))
		{
			ret = ret * 10 + flag * (*p - '0');
			if (ret > INT_MAX)
			{
				return INT_MAX;
			}
			else if (ret < INT_MIN)
			{
				return INT_MIN;
			}
			//这里判断是否超过int类型的最大值或者最小值
			//返回前没有改变state的合法性 所以默认都是非法返回值
		}
		else
		{
			return (int)ret;
			//如果没有遇到字符串末尾就已经不是数字字符
			//说明字符串非法 返回非法前的数字字符
		}
		p++;
	}
	state = VALID;//此时经过所有筛选 返回值合法 将状态修改为合法
	return (int)ret;


}


int main()
{
	printf("%d", my_atoi("1231#5646"));
	return 0;
}

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