转: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。不知道你注意到了那些空格,越界之类的判断没有。我同学说他写出来的代码最后就被要求加上了这些东西,最后还因此被卡掉了(说是考虑不够慎密,汗)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值