首页 > 代码库 > 170319 剑指offer 1.把一个字符串转化成整数(简单问题的全面性考虑)
170319 剑指offer 1.把一个字符串转化成整数(简单问题的全面性考虑)
工作的时间越长,越感觉基础的重要性,当我们对程序的框架结构越来越熟悉的时候,越会注意这一点,在工作当中,功能的实现是重要的,但是代码的健壮性,重用性,与扩展性确往往更为重要,在学习新技术的同时,我们或许应该抽出一点时间,去思考代码可能出现的问题。
关于剑指offer的这本书,可能所有刚毕业找工作的人,或者准备找工作的人都曾经看过,但是当时我们面对一些东西的时候心情过于浮躁,往往忽视了简单的却又十分重要的环节,(ps:也可能只有我是这样)
面试中一道简单的问题(把一个字符串转化成整数)
可能接触c++一天的人就能写出这样的代码
int StrToInt(char* string)
{
int number = 0;
while(*string !=0)
{
number = number*10+*string-‘0‘;
++string;
}
return number;
}
逻辑很简单,不需要过多的解释
但是,越是简单的问题,所需要考虑的过多,在我们最初接触编程的时候,我们过于注重实现,以至于忽略了诸如一些特殊情况,比如特殊的字符输入,比如边界范围等等
以上面的代码为例子,如果我们传入了空的指针,那么程序就会立即崩溃,而崩溃对于程序来说,其影响是致命的。
//string转化为int的函数,支持八进制,十进制,十六进制
bool StrToInt(char* string,int &result) //返回结果代表是否成功,string为输入字符,result为转化后的整数
{
if(string==NULL) return false; //进行字符串的空指针判断
int sign = 1; //正负号判断标志
int radix = 10; //进制的判断
//进行首字符的正负号判断
if(*str==‘-‘)
{
sign = -1;
str++;
}
else if(*str==‘+‘)
{
str++;
}
if(*string ==‘\0‘) return false; //当只有一个正负号或者什么都没有时,转化失败
if(*str==‘0‘&&(*str==‘x‘||*str==‘X‘)) //进行进制的判断
{
radix = 16;
}
else if(*str==‘0‘)
{
radix = 8;
}
else
{
radix = 10;
}
while(*string !=‘\0‘)
{
if(*string>=‘a‘&&*string<=‘f‘&&radix==16) //16进制包含字符abcdef,因此单独进行判断
{
number = number*radix+*string-‘a‘+10;
}
else if(*string>=‘0‘&&*str<=‘9‘) //8进制,10进制,以及16进制的0-9的字符
{
number = number*10+*string-‘0‘;
}
else //当出现其他错误字符时,直接返回false,这里是进行错误字符输入的判断
{
return false;
}
++string;
}
return true;
}
当你以为
这样就解决了这个问题,那么就大错特错大了,因为上面的代码没有考虑到,当输入的字符串过多,导致转化的值超出int时会出现的情况,所以还需要相应判断边界范围
定义一个double变量等于相乘,拿结果与65535进行比较,如果超过了抛出一个异常(代码不写了)
这个问题十分简单,以至于我们说明的不是这个问题本身,而是对于程序当中的空指针,越界,特殊输入的规范
菜鸟一枚,欢迎各位指出不足,感激不尽
170319 剑指offer 1.把一个字符串转化成整数(简单问题的全面性考虑)