首页 > 代码库 > 字符串转换成整型

字符串转换成整型

题目:将字符串转换成整型,比如输入“123”,输出123。 


解题思路:

利用每一个0-9数字字符对应的Ascii减去48就得到了一个0-9的整型数字。用前i-1位表示的整型数字乘以10加上第i位表示的数字,就可以得到转换成的整型了。注意字符串第1个字符也可以是+或-。当字符串第1个字符是-时,用前i-1位表示的整型数字乘以10减去第i位表示的数字,就可以得到转换成的整型了。这样的话,还可以适用前面的数字有0的情况。比如输入“-0123”,输出-123。另外还有一个需要注意的地方就是溢出:字符串转换成的整型不能超过整型可以表示数字的范围。 


int strToInt(char str[])
{
    int max = (1<<30)-1+(1<<30);//32位系统整型可以表示的最大数,之所以不直接用(1<<31)-1是因为在1<<31时整型溢出了,虽然只会报一个警告
	int min=(-1<<31);//32位系统整型可以表示的最小数
	int number=0;//number表示字符串转换成的整型,当无法转换时,会提醒并返回0
	if(str==NULL)//字符串为空时
	{
		printf("该字符串为空,无法转换成整型");
		return 0;
	}
	int n=0;
	while(str[n]!='\0')//遍历看字符串中是否有非法字符
	{
		if(n==0)//字符串中第1个字符可以是0-9的数字或+或-
		{
			if((str[n]>=48&&str[n]<=57)||str[n]=='+'||str[n]=='-')
			{

			}
			else 
			{
				printf("该字符串无法转换成整型");
				return 0;
			}
		}
		else //字符串除第1个字符外,其他字符都必须是0-9
		{
			if(str[n]>57||str[n]<48)
			{
				printf("该字符串无法转换成整型");
				return 0;
			}
		}
		n++;
	}
	if(str[0]=='\0')//字符串为空串时
	{
		printf("该字符串为空串,无法转换成整型");
		return 0;
	}
	else if(str[0]=='+')//字符串第一个字符是+时
	{
		int i=1;
		while(str[i]!='\0')
		{	
		    //判断所转换成的整型数字是否会溢出
			if(number>max/10)
			{
				printf("该字符串转换成整型会溢出,无法转换成整型");
				return 0;
			}
			else if(number==max/10)
			{
				if(str[i]-48>max%10)
				{
					printf("该字符串转换成整型会溢出,无法转换成整型");				
					return 0;
				}
			}
			
			number=10*number+(str[i]-48);	
			i++;
		}
		return number;
	}
	else if(str[0]=='-')
	{
		int i=1;
		while(str[i]!='\0')
		{
		    //判断所转换成的整型数字是否会溢出
			if(number<min/10)
			{
				printf("该字符串转换成整型会溢出,无法转换成整型");
				return 0;
			}
			else if(number==min/10)
			{
				if(-(str[i]-48)<min%10)
				{
					printf("该字符串转换成整型会溢出,无法转换成整型");				
					return 0;
				}
			}
			
			number=10*number-(str[i]-48);
			i++;
		}
		return number;
	}
	else
	{
		int i=0;
		while(str[i]!='\0')
		{
		    //判断所转换成的整型数字是否会溢出
			if(number>max/10)
			{
				printf("该字符串转换成整型会溢出,无法转换成整型");
				return 0;
			}
			else if(number==max/10)
			{
				if(str[i]-48>max%10)
				{
					printf("该字符串转换成整型会溢出,无法转换成整型");				
					return 0;
				}
			}
			number=10*number+(str[i]-48);
			i++;
		}
		return number;
	}

}


字符串转换成整型