标签:字符串转整型 字符串转换 转换成整型 转成整型 字符转整型
题目:将字符串转换成整型,比如输入“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; } }
标签:字符串转整型 字符串转换 转换成整型 转成整型 字符转整型
原文地址:http://blog.csdn.net/lavor_zl/article/details/42705681