atoi把字符串转换为数字(不调用库函数,含八进制、十进制、十六进制)

#include 
#include 
#include 
#include 

//a to i 
//库里面的 atoi函数 只能转换十进制
//字符串转整数

//八进制,当遇到非数字字符就退出
int o_atoi(const char *str)
{
	int tmp = 0;
	const char *ptr = str; //定义这个ptr是为了之后的符数输出“-”

	if(*str == '-' || *str == '+') //为了避免正负号被错杀
	{
		*str++;
	}

	while(*str != '\0')
	{
		if(!isdigit(*str))
		{
			break;
		}
		else
		{
			tmp = tmp*8 + (*str-48);
			*str++;
		}
	}

	if(*ptr == '-')
	{
		tmp = -tmp;  //此时又从首位开始解引用
	}
	return tmp;
}

//十进制,当遇到非数字字符就退出
int d_atoi(const char *str)
{
	int tmp = 0;
	const char *ptr = str; //定义这个ptr是为了之后的符数输出“-”

	if(*str == '-' || *str == '+')
	{
		*str++;
	}

	while(*str != '\0')
	{
		if(!isdigit(*str))
		{
			break;
		}
		else
		{
			tmp = tmp*10 + (*str-48);
			*str++;
		}
	}

	if(*ptr == '-')
	{
		tmp = -tmp;
	}
	return tmp;
}


//十六进制,遇到非数字需要判断才可以退出
int x_atoi(const char *str)
{
	int tmp = 0;
	const char *ptr = str; //定义这个ptr是为了之后的符数输出“-”

	if(*str == '-' || *str == '+')
	{
		*str++;
	}
	//字符串不为空且字符属于十六进制
	while(*str != '\0' && isxdigit(*str))
	{
		if(isdigit(*str))  //如果是数字直接转换
		{
			tmp = tmp*16 + (*str-48);
		}
		else
		{   
			char ch = toupper(*str);  //把小写变成大写
			tmp = tmp*16 + ch - 'A' + 10;  //比如ch为B,字符b-字符a为1,再+10,即为十六进制的11
		}
		*str++;
	}

	if(*ptr == '-')
	{
		tmp = -tmp;
	}
	return tmp;
}

//后面的~36进制都可以此类推,改变while()中的字符判定条件即可。

int main()
{
	char str1[100] = "-12";
	char str2[100] = "12a3";
	char str3[100] = "y12";
	char str4[100] = "1a";
	char str5[100] = "-12a3";
	
	//对负数情况进行测试
	unsigned int n1 = o_atoi(str1);
	unsigned int n2 = d_atoi(str1);
	unsigned int n3 = x_atoi(str1);

	//对十六进制测试
	unsigned int n4 = x_atoi(str4);
	unsigned int n5 = x_atoi(str5);

	unsigned int k1 = o_atoi(str2);
	unsigned int k2 = d_atoi(str3);
	unsigned int k3 = x_atoi(str1);

	printf("%d\n",n1);
	printf("%d\n",n2);
	printf("%d\n",n3);
	printf("%d\n",n4);
	printf("%d\n",n5);

	printf("%d\n",k2);


	return 0;
}

 

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