码迷,mamicode.com
首页 > 其他好文 > 详细

string to integer

时间:2014-10-27 22:55:56      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   color   ar   使用   sp   div   on   

 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

标签:style   blog   io   color   ar   使用   sp   div   on   

原文地址:http://www.cnblogs.com/gaoduan/p/4055370.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!