这是一个很经典的问题,有一次被笔试到,虽然之前看到过,知道主要的注意点,比较快的写了一个代码,但是在笔试完了的间隙,想到一个严重的bug,然后一面的时候和面试官说了,然后讲解了思路,面试官还算满意。等待二面时,无所事事的我还在想这道编程题,结果竟然又发现一个问题,少不得再忐忑不安和二面的面试官说新的发现。面试回去当天的晚上,有感于自己代码写的太少,就想编程实现这个小程序,结果很悲剧的,在写代码调试的过程中竟然又发现了一个考虑不周的地方,修复这个考虑不周的bug竟然又引入了一个新的bug。可以说,费了不少力气,才最终写出一个比较满意的程序。最大的感受是,一个问题,哪怕有比较完整的想法,也尽量去实现,因为在实现中你才能把所有隐藏的问题都揪出来,才能说,你真正解决了这个问题。附上代码,请各路英雄斧正。
#include<iostream>
#include<climits>
int cal_digit(const char chr)
{
if(('0'<=chr)&&(chr<='9'))
{
return chr-'0';
}
return -1;
}
/**
1) err_state=0,normal
2) err_state=1,pa is NULL
3) err_state=2,input string exceed int range
4) err_state=3,input string contain illegal char
*/
int str2int( const char* pa,int &err_state)
{
using namespace std;
err_state=0;
if(NULL==pa){
err_state=1;
return -1;
}
bool is_negative = 0;
double int_max = INT_MAX;
if(*pa=='+'){
pa++;
}
if(*pa=='-')
{
pa++;
is_negative = 1;
//int_max = -1 * INT_MIN;
int_max = -1.0 * INT_MIN ;
}
double result=0;
int digit;
while(*pa){
digit = cal_digit(*pa);
if(digit == -1)
{
err_state=3;
return -1;
}
else{
result*=10;
result+=digit;
if(result>int_max)
{
err_state=2;
return -1;
}
}
pa++;
}
if(is_negative)
{
result=-result;
}
return int(result);
}
在这道简单的程序里,有几个地方特别说一下