面试中被问到了这个问题,当时答得不太好,没有考虑全面,回来总结一下,如有遗漏,欢迎指正。
知道C语言中有2个函数atoi()和 itoa(),但对具体实现不是很清楚,现在自己总结实现一下:
字符串转整型
这个情况稍微复杂一些,要考虑全面
- 字符串开始有空格,要先判断过滤‘ 123’
- 存在符号'+'和'-'要判断
- 存在小数点,也就是'123.45'转为整型是123
- 字符串超过整型int的范围,就转为int表示最边缘的数
- 存在不合法的字符串‘+-123’则转为-,‘123 456’’转为123,
整型转字符串
也要考虑全面,分析各种情况
首先要考虑正负号,然后倒序(a%10)的方式转成字符串,最后判断符号,倒序输出
/* 把字符串转换成整型数 atoi() */ int str2int(char s[]) { int temp=0; int flag=1; int i=0; while(i<sizeof(s)&&s[i]==' ') i++; if(s[i]=='+'||s[i]=='-') { if(s[i]=='-') flag=-1; i++; } while( s[i]>='0'&&s[i]<='9') { temp=temp*10+(s[i]-'0'); i++; if(temp<0) { //超出int范围-2147483648~2147483647 temp=2147483647; break; } } return flag*temp; } /* 把整数转换为字符串 itoa() */ void int2str(int temp,char s[]) { int flag=1; if(temp<0) { temp=-temp; flag=-1; } int i=0; while(temp>0) { s[i]=temp%10+'0'; i++; temp=temp/10; } if(flag==-1) s[i++]='-'; s[i]='\0'; for(int j=i-1; j>=0; j--) printf("%c",s[j]); printf("\n"); }
更新于2017.9.13
上述的方法s="-2147483648",超出整数最小范围的结果不对,做如下改进:
public class StrToInt { public static void main(String[] args) { // TODO Auto-generated method stub String s=" -2147483648"; System.out.println(strToint(s)); } public static int strToint(String str) { char []s=str.toCharArray(); int flag=1,sum=0; if(s.length==0) return 0; int i=0; while(i<s.length && s[i]==' ') i++; if(i<s.length && (s[i]=='-'||s[i]=='+')){ if(s[i]=='-') flag=-1; i++; } while(i<s.length && s[i]>'0'&&s[i]<'9') { sum=sum*10+(s[i]-'0'); if(sum<0 && flag==1){ return Integer.MAX_VALUE; } if(sum<0 && flag==-1){ return Integer.MIN_VALUE; } i++; } return flag*sum; } }
总结,遇到问题要先思考个1分钟,考虑清楚了再动手写,不能慌张!