字符串转换成整型

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


解题思路:

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


[cpp]  view plain copy
  1. int strToInt(char str[])  
  2. {  
  3.     int max = (1<<30)-1+(1<<30);//32位系统整型可以表示的最大数,之所以不直接用(1<<31)-1是因为在1<<31时整型溢出了,虽然只会报一个警告  
  4.     int min=(-1<<31);//32位系统整型可以表示的最小数  
  5.     int number=0;//number表示字符串转换成的整型,当无法转换时,会提醒并返回0  
  6.     if(str==NULL)//字符串为空时  
  7.     {  
  8.         printf("该字符串为空,无法转换成整型");  
  9.         return 0;  
  10.     }  
  11.     int n=0;  
  12.     while(str[n]!='\0')//遍历看字符串中是否有非法字符  
  13.     {  
  14.         if(n==0)//字符串中第1个字符可以是0-9的数字或+或-  
  15.         {  
  16.             if((str[n]>=48&&str[n]<=57)||str[n]=='+'||str[n]=='-')  
  17.             {  
  18.   
  19.             }  
  20.             else   
  21.             {  
  22.                 printf("该字符串无法转换成整型");  
  23.                 return 0;  
  24.             }  
  25.         }  
  26.         else //字符串除第1个字符外,其他字符都必须是0-9  
  27.         {  
  28.             if(str[n]>57||str[n]<48)  
  29.             {  
  30.                 printf("该字符串无法转换成整型");  
  31.                 return 0;  
  32.             }  
  33.         }  
  34.         n++;  
  35.     }  
  36.     if(str[0]=='\0')//字符串为空串时  
  37.     {  
  38.         printf("该字符串为空串,无法转换成整型");  
  39.         return 0;  
  40.     }  
  41.     else if(str[0]=='+')//字符串第一个字符是+时  
  42.     {  
  43.         int i=1;  
  44.         while(str[i]!='\0')  
  45.         {     
  46.             //判断所转换成的整型数字是否会溢出  
  47.             if(number>max/10)  
  48.             {  
  49.                 printf("该字符串转换成整型会溢出,无法转换成整型");  
  50.                 return 0;  
  51.             }  
  52.             else if(number==max/10)  
  53.             {  
  54.                 if(str[i]-48>max%10)  
  55.                 {  
  56.                     printf("该字符串转换成整型会溢出,无法转换成整型");               
  57.                     return 0;  
  58.                 }  
  59.             }  
  60.               
  61.             number=10*number+(str[i]-48);     
  62.             i++;  
  63.         }  
  64.         return number;  
  65.     }  
  66.     else if(str[0]=='-')  
  67.     {  
  68.         int i=1;  
  69.         while(str[i]!='\0')  
  70.         {  
  71.             //判断所转换成的整型数字是否会溢出  
  72.             if(number<min/10)  
  73.             {  
  74.                 printf("该字符串转换成整型会溢出,无法转换成整型");  
  75.                 return 0;  
  76.             }  
  77.             else if(number==min/10)  
  78.             {  
  79.                 if(-(str[i]-48)<min%10)  
  80.                 {  
  81.                     printf("该字符串转换成整型会溢出,无法转换成整型");               
  82.                     return 0;  
  83.                 }  
  84.             }  
  85.               
  86.             number=10*number-(str[i]-48);  
  87.             i++;  
  88.         }  
  89.         return number;  
  90.     }  
  91.     else  
  92.     {  
  93.         int i=0;  
  94.         while(str[i]!='\0')  
  95.         {  
  96.             //判断所转换成的整型数字是否会溢出  
  97.             if(number>max/10)  
  98.             {  
  99.                 printf("该字符串转换成整型会溢出,无法转换成整型");  
  100.                 return 0;  
  101.             }  
  102.             else if(number==max/10)  
  103.             {  
  104.                 if(str[i]-48>max%10)  
  105.                 {  
  106.                     printf("该字符串转换成整型会溢出,无法转换成整型");               
  107.                     return 0;  
  108.                 }  
  109.             }  
  110.             number=10*number+(str[i]-48);  
  111.             i++;  
  112.         }  
  113.         return number;  
  114.     }  
  115.   
  116. }  

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值