模拟实现atoi函数

atoi (表示 ascii to integer)是把字符串转换成整型数的一个函数,应用在计算机程序和办公软件中。

注意:

atoi( ) 函数会扫描参数 nptr字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过isspace( )函数来检测),直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回。如果 nptr不能转换成 int 或者 nptr为空字符串,那么将返回 0 。转换后的结果要考虑是否溢出。

#include
#include
#include

enum
{
	valid = 1,
	invalid = 0
};
int flag = valid;
int my_atoi(const char* str)
{
	assert(str);
	long long ret = 0;
	int symbol = 1;//用于判断符号
	//判断是否为空字符
	if (*str == '\0')
	{
		flag = invalid;
		return 0;
	}
	//去掉空格,制表符
	while (isspace(*str))
	{
		str++;
	}
	//判断符号
	if ((*str == '-'))
	{
		symbol = -1;
		str++;
		if (((*str < '0') || (*str > '9')))
		{
			flag = invalid;
			return 0;
		}
	}
	else if (*str == '+')
	{
		str++;
	}
	else if (((*str < '0') || (*str > '9')))
	{
		flag = invalid;
		return 0;
	}
	//处理完异常,开始转换
	while ((*str != '\0') && (*str >= '0') && (*str <= '9'))
	{
		ret = ret * 10 + *str - '0';
		str++;
	}
	//带上符号
	ret *= symbol;
	//检测结果是否溢出
	//int 0111 1111 1111 1111 1111 1111 1111 1111 正溢出
	//     7     f    f   f     f    f    f    f
	//    1000 0000 0000 0000 0000 0000 0000 0000 负溢出
	//      8    0    0   0     0    0    0    0
	if (((ret > 0x7fffffff) && (symbol == 1)) ||
		(ret < (signed int)0x80000000) && (symbol == -1))
	{
		flag = invalid;
		return 0;
	}
	//ret合法
	flag = valid;
	return ret;
}
//打印输出是否异常
void PrintState()
{
	if (flag)
		printf("正常\n");
	else
		printf("异常\n");
}
void Test()
{
	printf("value=%d ", my_atoi("123456789"));//正常
	PrintState();
	printf("value=%d ", my_atoi("-123456789"));//正常
	PrintState();
	printf("value=%d ", my_atoi("-123456789abc"));//正常,遇到字母终止
	PrintState();
	printf("value=%d ", my_atoi("    -123456789abc"));//正常,前面带空格
	PrintState();

	printf("value=%d ", my_atoi("abc123456789"));//异常,前面有字母
	PrintState();
	printf("value=%d ", my_atoi("-abc123456789"));//异常,前面有字母
	PrintState();
	printf("value=%d ", my_atoi("+abc123456789"));//异常,前面有字母
	PrintState();
	printf("value=%d ", my_atoi("123.456789"));//正常 输出123
	PrintState();
	printf("value=%d ", my_atoi("+123.456789"));//正常 输出123
	PrintState();
	printf("\n\n\n");
	printf("value=%d ", my_atoi(""), flag);//异常:空字符串
	PrintState();
	printf("value=%d ", my_atoi("123456789123456789"));//异常:正溢出
	PrintState();
	printf("value=%d ", my_atoi("-123456789123456789"));//异常:负溢出
	PrintState();
	printf("value=%d ", my_atoi("abcd"));//异常:无法转换
	PrintState();
}
int main()
{
	Test();
	system("pause");
	return 0;
}

模拟实现atoi函数_第1张图片

你可能感兴趣的:(C语言,模拟实现)