用C语言模拟实现atoi

atoi函数的作用:

cpluscplus解释:该函数首先根据需要丢弃尽可能多的空格字符(如 ),直到找到第一个非空格字符。然后,从此字符开始,取一个可选的首字母加号或减号,后跟尽可能多的 10 进制数字,并将它们解释为数值。

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

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

简单讲,就是跳过字符串起始的空格字符(如果有的话),然后将首先遇到的数字(可以包括一个+或-字符)转化为整型数值并返回,否则返回0。

atoi("   123abc"),跳过起始的空格字符,首先遇到的数字是123,返回123.

atoi("   +123abc"),跳过起始的空格字符,首先遇到的数字是+123,返回123.

atoi("   -123abc"),跳过起始的空格字符,首先遇到的数字是-123,返回-123.

atoi("   ++123abc"),跳过起始的空格字符,连续遇到两个+,返回0.

atoi("abc123") ,遇到的第一个非空格字符不是数字,返回0;

 atoi函数的声明是

int atoi (const char * str);

以下是代码的模拟实现:

#include
#include
#include
int my_atoi(const char* str)
{
    //防止str是空指针
	assert(str);
	//跳过开头的空格字符
	while (*str == 32)
	{
		str++;
	}
	//跳过开头遇到的空格字符,如果遇到的是除 空格,+,-,数字以外的字符,返回0
	if (*str != 43 && *str != 45 && (*str < 48 || *str>57))
		return 0;
	int num = 0;//跳过开头的空格后,记录遇到正负号的次数,如果num>1,返回0
	int judge = 1;//记录正负号,正号是1,负号是-1
	while (*str == 43 || *str == 45)//跳过起始的空格字符后,判断接下来的字符的正负号情况
	{
		num++;
		if (*str == 45)
			judge = -1;
		if (num > 1)//如果遇到+,-字符超过1个,退出函数并返回0
			return 0;
		str++;
	}
	//判断完起始的空格字符和+、-字符后,如果遇到的第一个字符不是数字,返回0
	if (*str < 48 || *str>57)
		return 0;
	char* p = str;//记录遇到的一个数字的地址
	while (*str >= 48 && *str <= 57)
	{
		str++;
	}
	str--;//这是最后一个数字的地址
	int my_pow = 1;
	num = 0;//返回遇到的数字的大小
	//假设char arr[]="123";
	//欲将其转化为整型,则int a = 3*10^0 + 2*10^1 + 1*10^2
	//即 a = *(&arr[2]) *10^0 + *(&arr[1]) *10^1 + *(&arr[0]) *10^2
	for (int i = 0; p <= str; i++)
	{
		num += ((int)(*str) - 48) * my_pow;
		my_pow *= 10;
		str--;
	}
	if (judge == -1)//如果是负号,就再乘以-1
		num = -num;
	return num;
}
int main()
{
	char arr[] = "abc123abc";
	int a = my_atoi(arr);
	int b = atoi(arr);
	printf("%d\n", a);
	printf("%d\n", b);
	return 0;
}

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