首页 > 代码库 > 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&×_minus==true )|| (number>0 && times_minus==true))62 number=-2147483648;63 //正溢出64 else if((of &×_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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。