首页 > 代码库 > string to integer

string to integer

 1 class Solution { 2     public: 3         //计算一个整数的位数,在溢出判断中使用 4         int bit_length(int n)    { 5             int l=0; 6             while(n!=0){ 7                 l++; 8                 n/=10; 9             }10             return l;11         }12     int atoi(const char *str){13         if(*str==\0) return 0;14         // 将开头的空白字符和0去掉15         while(isspace(*str) || *str-0 ==0 )str++;16         int number=0;17         bool times_minus=false;//是否是负数18         bool symbol=false; //是否违法19         bool of=false;  //是否溢出20         while(*str!=\0){21             //+号处理22             if(*str==-)    {23                 if(((*(str+1)==\0 )&&number!=0)|| !isdigit(*(str+1))){24                     symbol=true;25                     break;26                 }27                 times_minus=true;28             }29             //-号处理30             else if(*str==+){31                  if(((*(str+1)==\0)&&number!=0) || !isdigit(*(str+1))){32                      symbol=true;33                      break;34                      35                  }36               }37             //数字处理38             else if(isdigit(*str)){   39                 if(*str-0==0 && number==0)40                 {}41                 else{42                     int num_copy=number;43                     number=number*10+*str-0;44                     //溢出判断45                     if(bit_length(number)==bit_length(num_copy)){46                         of=true;47                     }48                 }49                 50             }51             //其他字符处理52             else 53                 break;54 55             str++;56         }    57     58         if(times_minus==true)59             number*=-1;60         //负溢出            61         if (( of&&times_minus==true )|| (number>0 && times_minus==true))62             number=-2147483648;63         //正溢出64         else if((of &&times_minus==false)|| (number<0 && times_minus==false))65             number=2147483647;66             67         if(symbol)68             return 0;69         else return number;70     }71 };

将一个字符串转为一个整数本来是很简单的,但这里要处理的溢出的问题,关于整数的溢出可以参考CSAPP一书(汗,基本上参考的数目都是CSAPP、SICP、CLRS。。。不过这几本书都是神书级别,看了就会有很大提高的好书)。
题目要求

1. 字符串开头可以有空白字符;

2. 字符串里面出现不合法的字符就从这个截断;

3. +号和负号只能出现在数字的开头,且只有一个;

4. 数字溢出后按照32位整数表示来处理;这一步是重点,我结合了位数变换和操作数的符号来综合判断。

5. 数字开头可能有0,也需要滤去

string to integer