博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
转:atoi函数的实现
阅读量:6964 次
发布时间:2019-06-27

本文共 1510 字,大约阅读时间需要 5 分钟。

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 int
LONG_MAX + 1) / 10
   && digval > ((
unsigned long int
LONG_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/archive/2012/05/25/5005538.html

你可能感兴趣的文章
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(39)-在线人数统计探讨
查看>>
Linux下批量替换文件内容方法
查看>>
C#程序实现动态调用DLL的研究(转)
查看>>
mongoDB 3.0 安全权限访问控制 -摘自网络
查看>>
VBOX Ubuntu设置与Windows的共享文件夹
查看>>
android 获取activity当前view
查看>>
Linux内存管理-高端内存(一)
查看>>
Python 包管理工具解惑
查看>>
Java正則表達式入门
查看>>
打patch p0 p1区别
查看>>
UESTC 2015dp专题 E 菲波拉契数制 dp
查看>>
C#如何把List of Object转换成List of T具体类型
查看>>
怎样在多线程中使用JNI?
查看>>
什么是全栈开发者
查看>>
Java基本数据类型总结
查看>>
FusionCharts简明教程(一)---建立FusionCharts图形
查看>>
JAVA字符串格式化-String.format()的使用
查看>>
关于 android 环信无法正确获取昵称的问题
查看>>
从大数据到安全大数据分析
查看>>
【Android自定义控件】支持多层嵌套RadioButton的RadioGroup
查看>>