atoi函数的模拟实现

发布时间:2024年01月05日

1.atoi函数介绍


int atoi (const char * str);
//需要头文件<stdlib.h>

函数功能:

  • 将字符串str转换成整数并返回

注意事项:

  • 在转换过程中,如果在遇到数字字符之前遇到空白字符,则省略掉空白字符
  • 如果在遇到数字字符之前遇到非数字字符,则停止转换,直接返回
  • 如果返回的值超过int的最大值或最小值,返回INT_MAX或INT_MIN
int main()
{
	char arr1[] = "123456";
	char arr2[] = "-123456";
	char arr3[] = "     -123456";
	char arr4[] = "-123abc456";
	char arr5[] = "-abc123456";
	char arr6[] = "abc";
	char arr7[] = "";
	char arr8[] = "1111111111111111111111111";
	char arr9[] = "-1111111111111111111111111";
    
	printf("%d\n", atoi(arr1));// 123456
	printf("%d\n", atoi(arr2));// -123456
	printf("%d\n", atoi(arr3));// -123456
	printf("%d\n", atoi(arr4));// -123
	printf("%d\n", atoi(arr5));// 0
	printf("%d\n", atoi(arr6));// 0
	printf("%d\n", atoi(arr7));// 0
	printf("%d\n", atoi(arr8));// 2147483647(INT_MAX)
	printf("%d\n", atoi(arr9));// -2147483647(INT_MIN)

	return 0;
}

2.atio函数的模拟实现


写代码时,我们要考虑周全,写出来的代码不仅仅是完成我们预期的结果,还要能处理各种异常情况

我们模拟实现的atoi函数要能够处理下面的情况:

  1. 空字符串,传过来的字符串没有值时,返回0
  2. 空白字符,跳过空白字符
  3. 正负号,有负号,返回也应当返回相应的负值
  4. 数据超过INT_MAX,直接返回INT_MAX;超过INT_MIN,直接返回INT_MIN
  5. 非数字字符,只转换数字字符

问题1:

有时候返回的值可能是正常的,也有可能是异常的,但和正常值在数值上是一样的;就比如空字符串,此时返回0,而atoi(“0”)也是返回0,那么0到底空字符串返回的异常值,还是转换后返回的正常值呢?这就产生了歧义

于是,我们定义一个枚举类型,并用该类型创建一个变量,默认值是异常值,如果atoi函数结束时,该变量是异常值,表示返回的值是异常的,否则是正常的

enum State
{
	VALID,
	INVALID
}state = INVALID;

问题2:

对于一个只有数字字符的字符串,怎么将该字符串转换成对应的整数?

”123456“—>123456:定义一个变量val,初始化为0,遍历字符串,将每一个字符减去’0’并和val相加,直到遍历完字符串,最后的值就是转换出来的值

enum State
{
	VALID,
	INVALID
}state = INVALID;

int my_atoi(const char* str)
{
	assert(str);

	state = INVALID;

	//处理空字符串
	if (*str == '\0')
		return 0;

	//处理空白字符
	while (isspace(*str))
	{
		str++;
	}

	//处理正负号
	int flag = 1;
	if (*str == '+')
	{
		flag = 1;
		str++;
	}
	else if (*str == '-')
	{
		flag = -1;
		str++;
	}

	//转换
	long long val = 0;
	while (*str)
	{
		if (isdigit(*str))
		{
			val = val * 10 + flag * (*str - '0');
			if (val > INT_MAX || val < INT_MIN)
			{
				if (flag == 1)
					return INT_MAX;
				else
					return INT_MIN;
			}
			str++;
		}
		else
		{
			return (int)val;
		}
	}

	state = VALID;
	return (int)val;
}

void ReturnVal(char arr[])
{
	assert(arr);

	int ret = my_atoi(arr);
	if (state == VALID)
		printf("正常返回:%d\n", ret);
	else
		printf("异常返回:%d\n", ret);
}

int main()
{
	char arr1[] = "123456";
	char arr2[] = "-123456";
	char arr3[] = "     -123456";
	char arr4[] = "-123abc456";
	char arr5[] = "-abc123456";
	char arr6[] = "abc";
	char arr7[] = "";
	char arr8[] = "1111111111111111111111111";
	char arr9[] = "-1111111111111111111111111";

	ReturnVal(arr1);// 正常返回:123456
	ReturnVal(arr2);// 正常返回:-123456
	ReturnVal(arr3);// 正常返回:-123456
	ReturnVal(arr4);// 异常返回:-123
	ReturnVal(arr5);// 异常返回:0
	ReturnVal(arr6);// 异常返回:0
	ReturnVal(arr7);// 异常返回:0
	ReturnVal(arr8);// 异常返回:2147483647
	ReturnVal(arr9);// 异常返回:-2147483648
    
	return 0;
}
文章来源:https://blog.csdn.net/2303_77982246/article/details/135417900
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。