字符串转整数

本文转自csdn博主v_JULY_v

字符串转整数基本思路:每扫描到一个字符,我们便把在之前得到的数字乘以10,然后再加上当前字符表示的数字

要求:不能用库函数atoi,此处相当于要求程序猿写一个实现atoi功能函数函数

注意的细节

  1. 由于整数可能不仅仅之含有数字,还有可能以'+'或者'-'开头,表示整数的正负。因此我们需要把这个字符串的第一个字符做特殊处理。如果第一个字符是'+'号,则不需要做任何操作;如果第一个字符是'-'号,则表明这个整数是个负数,在最后的时候我们要把得到的数值变成负数。
  2. 接着我们试着处理非法输入。由于输入的是指针,在使用指针之前,我们要做的第一件是判断这个指针是不是为空。如果试着去访问空指针,将不可避免地导致程序崩溃。
  3. 另外,输入的字符串中可能含有不是数字的字符。每当碰到这些非法的字符,我们就没有必要再继续转换。
  4. 最后一个需要考虑的问题是溢出问题。由于输入的数字是以字符串的形式输入,因此有可能输入一个很大的数字转换之后会超过能够表示的最大的整数而溢出。
    1. 2种溢出的情况
      1. 一种是诸如2147483650,即n > MAX/10 的;
      2. 一种是诸如2147483649,即n == MAX/10 && c > MAX%10。
    比如,当给的字符串是如左边图片所示的时候,有考虑到么?当然,它们各自对应的正确输出如右边图片所示( 假定你是在32位系统下,且编译环境是VS2008以上):
                                                                  
优化好的代码 如下:
unsigned int为0 ~ 2^31-1 (2147483648),int为-2^31 ~ 2^31-1
  1. //copyright@njnu_mjn 2013  
  2. int StrToDecInt(const char* str)    
  3. {    
  4.     static const int MAX = (int)((unsigned)~0 >> 1);    //2147483647
  5.     static const int MIN = -(int)((unsigned)~0 >> 1) - 1;    //-2147483649
  6.     static const int MAX_DIV = (int)((unsigned)~0 >> 1) / 10;    //214748364
  7.     static const int MIN_DIV = (int)((((unsigned)~0 >> 1) + 1) / 10);    //214748364
  8.     static const int MAX_R = (int)((unsigned)~0 >> 1) % 10;           //7
  9.     static const int MIN_R = (int)((((unsigned)~0 >> 1) + 1) % 10);    //8
  10.     int n = 0;    
  11.     int sign = 1;    
  12.     int c;    
  13.     
  14.     while (isspace(*str))    //检查空指针
  15.         ++str;    
  16.     if (*str == '+' || *str == '-')    //特殊处理第一个字符
  17.     {    
  18.         if (*str == '-')    
  19.             sign = -1;    
  20.         ++str;    
  21.     }    
  22.     while (isdigit(*str))    //提前处理,避免溢出
  23.     {    
  24.         c = *str - '0';    
  25.         if (sign > 0 && (n > MAX_DIV || (n == MAX_DIV && c >= MAX_R)))    
  26.         {    
  27.             n = MAX;    
  28.             break;    
  29.         }    
  30.         else if (sign < 0 && (n > MIN_DIV     
  31.                                                     || (n == MIN_DIV && c >= MIN_R)))    
  32.         {    
  33.             n = MIN;    
  34.             break;    
  35.         }    
  36.         n = n * 10 + c;    
  37.         ++str;    
  38.     }    
  39.     return sign > 0 ? n : -n;    
  40. }    

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值