转:atoi函数的实现

atoi函数的实现

   写这个函数的实现的原因很简单,而且也很容易,直接抄袭的库中的源码。因为有朋友面试的时候遇到了,前几天一个哥们面intel的时候也被问到了,巧合的是今天看广联达的面试题再次遇到。一周之内看到三次,让我不得不重视一下啊,毕竟自己也要开始面试题呀面试题了!
   其实这个函数比较容易实现,不过写的很完善就不是那么容易,我自己也写了一下,然后去glibc库中看了一下,发现自己比较多的情况没有考虑到的,代码贴出来必然会被鄙视。所以这里就贴glibc库中使用的代码。本来打算贴vxwork的代码,可是vxwork的这段代码比较长而且有点晦涩,所以最后决定还是贴上相对更见简明的glibc库中的代码
   其实不管是atoi、atol都是调用的strtol这个函数,所以实际贴的是这个函数的代码。其实直接自己看glibc库就好了:
#define LONG_MAX 2147483647L  
#define LONG_MIN (-2147483647L-1L)
long int _strtol_internal (const char *nptr, char **endptr, int base, int group)
{
  unsigned long int result = 0;
  long int sign = 1;
  while (*nptr == ' ' || *nptr == '/t')
    ++nptr;
  if (*nptr == '-')
    {
      sign = -1;
      ++nptr;
    }
  else if (*nptr == '+')
    ++nptr;
  if (*nptr < '0' || *nptr > '9')
    {
      if (endptr != NULL)
 *endptr = (char *) nptr;
      return 0L;
    }
  assert (base == 0);
  base = 10;
  if (*nptr == '0')
    {
      if (nptr[1] == 'x' || nptr[1] == 'X')
 {
   base = 16;
   nptr += 2;
 }
      else
 base = 8;
    }
  while (*nptr >= '0' && *nptr <= '9')
    {
      unsigned long int digval = *nptr - '0';
      if (result > LONG_MAX / 10
   || (sign > 0 ? result == LONG_MAX / 10 && digval > LONG_MAX % 10
       : (result == ((unsigned long intLONG_MAX + 1) / 10
   && digval > ((unsigned long intLONG_MAX + 1) % 10)))
 {
   errno = ERANGE;
   return sign > 0 ? LONG_MAX : LONG_MIN;
 }
      result *= base;
      result += digval;
      ++nptr;
    }
  return (long int) result * sign;
}
atoi函数就是这个函数讲第二个参数置为NULL,第三个参数置为10。不知道你注意到了那些空格,越界之类的判断没有。我同学说他写出来的代码最后就被要求加上了这些东西,最后还因此被卡掉了(说是考虑不够慎密,汗)。

原文地址:https://www.cnblogs.com/zhiweiyouzhishenghuo/p/5005538.html