工作的时间越长,越感觉基础的重要性,当我们对程序的框架结构越来越熟悉的时候,越会注意这一点,在工作当中,功能的实现是重要的,但是代码的健壮性,重用性,与扩展性确往往更为重要,在学习新技术的同时,我们或许应该抽出一点时间,去思考代码可能出现的问题。

关于剑指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进行比较,如果超过了抛出一个异常(代码不写了)

这个问题十分简单,以至于我们说明的不是这个问题本身,而是对于程序当中的空指针,越界,特殊输入的规范

菜鸟一枚,欢迎各位指出不足,感激不尽

 

posted on 2017-03-19 14:38  Perfunctory  阅读(237)  评论(0编辑  收藏  举报