atoi函数及其模拟实现

 atoi的函数声明及功能如下:

这个函数的功能是将字符串转换为整形,那么具体是怎么样的呢

先看几个例子:

 当字符串中的数字前有空白字符时,会把空白字符去掉。

 当字符串中间有字母时,只会转换字母前的数字。

 字符串数字超过最大整形表示的范围时,返回整形最大值(最小值同理)。

有一个转换为整形的最大值

 空格后第一个字符是字母,会返回0。

刚开始就是非法字符

因此,我们模拟实现时,要考虑以上几种非法输入情况:

1.空字符串

2.空白字符

3.处理+-号

4.过大值过小值

5.数字中间有其他字符

atoi模拟实现:

#include <stdio.h>
#include <ctype.h>
#include <assert.h>
#include <stdlib.h>
enum State
{
	VALID,
	INVALID
}sta = INVALID;//默认设置为非法
int my_atoi(const char* str)
{
	//空指针
	assert(str);
	//空字符串
	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 r = 0;
	while (*str)
	{
		if(isdigit(*str))
		{
			r = r * 10 + flag*((long long)*str - '0');
			if (r > INT_MAX || r < INT_MIN)
			{
				if (flag == 1)
					return INT_MAX;
				else
					return INT_MIN;
			}
			str++;
		}
		else
		{
			return (int)r;
		}
	}
	sta = VALID;
	return (int)r;

}

int main()
{
	char arr[] = "   12ab34";//加几个空格
	int ret = my_atoi(arr);
	if (sta == VALID)
		printf("合法的转换:%d\n", ret);
	else
		printf("非法的转换:%d\n", ret);

	return 0;
}

在模拟实现过程中,我们定义了枚举类型State,目的是为了避免歧义,比如,当给my_atoi传入空字符串时,函数返回0,同时,当给my_atoi传入字符串"0"时,函数也应该返回0,这势必会造成歧义,因此,才定义了这样一个枚举类型,用枚举类型定义一个枚举变量sta,初始值为INVALID,当函数正常返回时,sta置为VALID,最终根据sta的值区分歧义!

猜你喜欢

转载自blog.csdn.net/qq_48460693/article/details/133803494