题目:将字符串转换成整型,比如输入“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;
- }
- }