看了atol的实现,发现char到int的转换比较奇怪:c = (int)(unsigned char)*nptr++; 先将char转为unsigned再转为int,于是测试了下,发现有如下结果:
void main()
{
    char c = 0x80;
    unsigned uc = 0x80;
    printf("c2i=%x,c2ui=%x,uc2i=%x,uc2ui=%x\n", \
    (int)c,(unsigned int)c,(int)uc,(unsigned int)uc
    );
}
结果:
c2i=ffffff80,c2ui=ffffff80,uc2i=80,uc2ui=80

可以发现,如果char默认为signed(可能是平台相关的),则将char转为int或uint时,会有符号位扩展,而unsigned char则不会。atol/atoi函数应该希望避免符号位扩展而带来问题。不过,好在数字0到9的ACSII码并没有超过0x7F,因此是否事先转成unsigned char应该不会对结果有影响。

另,转一篇类似问题造成的BUG:http://testing.etao.com/node/217

另外,atoi/atol是笔试面试常考问题,虽然看似不难,但往往实现起来漏洞百出。实现时注意以下几点:
1. 跳过开头空格。
2. 判断第一个有效字符(非空格)是否是符号‘+’或‘-’。
3. 当遇到非数字时,函数结束,输出之前字串代表的整数。
4. 为严谨起见,就是文中提到的的char转int问题。

附atol源码:

[cpp] view plaincopyprint?
  1. long __cdecl atol(
  2. const char *nptr
  3. )
  4. {
  5. int c;              /* current char */
  6. long total;         /* current total */
  7. int sign;           /* if '-', then negative, otherwise positive */
  8. /* skip whitespace */
  9. while ( isspace((int)(unsigned char)*nptr) )
  10. ++nptr;
  11. c = (int)(unsigned char)*nptr++;
  12. sign = c;           /* save sign indication */
  13. if (c == '-' || c == '+')
  14. c = (int)(unsigned char)*nptr++;    /* skip sign */
  15. total = 0;
  16. while (isdigit(c)) {
  17. total = 10 * total + (c - '0');     /* accumulate digit */
  18. c = (int)(unsigned char)*nptr++;    /* get next char */
  19. }
  20. if (sign == '-')
  21. return -total;
  22. else
  23. return total;   /* return result, negated if necessary */
  24. }
int atoi(const char *nptr)
{
return (int)atol(nptr);
}

atoi atol实现相关推荐

  1. 相关函数: atof, atoi, atol, strtod, strtoul

    strtod()           //字符串转为   double     strtof()           //字符串转为   float     strtols()         //字 ...

  2. C语言atof,atoi,atol函数用法详解和main函数2个参数的使用详解

    #include <stdlib.h> 三个都是这个库里面的函数 atof()函数用于将字符串转换为浮点数. 语法: double atof (const char* str); 参数: ...

  3. C语言 字符串与整数的相互转换(atoi/atol/sprintf函数简解)

    字符串转化为整数 atoi函数与atol函数 atol函数是将字符串转化为整形,atol函数是将字符串转化为长整型 注意:其实他们没什么区别. int main() {printf("siz ...

  4. 类型转换函数(atof(),atoi(),atol())

    头文件 类型转换函数的头文件为stdlib.h 1:atof()函数 函数原型:double atof(const char *s); 函数功能:字符串转换为浮点型 2:ayoi()函数 函数原型:i ...

  5. c语言 atol,C语言的常用类型转换函数(atoi,atol,strtod,strtol,strtoul)

    51Testing软件测试网W;cn2Jl^? atof(将字符串转换成浮点型数)51Testing软件测试网 I,g6C_$EP 相关函数51Testing软件测试网t9n3x]Z atoi,ato ...

  6. time,atoi,strstr

    几个简单的C函数,平时用的比较少.虽然简单,但还是比较陌生. #include<stdio.h> #include<time.h> #include<stdlib.h&g ...

  7. atoi函数_C语言字符串、数字转换函数大全!

    常用到字符串和数字的转换 想找却发现网上的资料太散 所以搜集整理一下,方便给大家以后再用 atof(将字符串转换成浮点型数) atoi(将字符串转换成整型数) atol(将字符串转换成长整型数) st ...

  8. atol的实现【转】

    本文转载自:http://blog.csdn.net/cwqbuptcwqbupt/article/details/7518582 看了atol的实现,发现char到int的转换比较奇怪:c = (i ...

  9. itoa函数和atoi函数的实现和用法

    itoa函数和atoi函数的用法 参考网址:http://wenhaidongke.blog.163.com/blog/static/12807009020098213576224/ C语言提供了几个 ...

最新文章

  1. 在报文摘要算法MD5中,首先要进行明文分组与填充,其中分组时明文报文摘要按照(42)位分组。【答案】C
  2. 最新 Windows 7 7100安装
  3. 《3D Math Primer for Graphics and Game Development》读书笔记1
  4. java clone方法_Java Calendar clone()方法与示例
  5. 利用营销工具,这家企业从按经验办事的老中医,变为数据化中西医
  6. android 正在上传动画,安卓系统上传文件动态显示进度条,进度条经常卡在99%有时也会卡住不显示完整的文字。...
  7. 【编译工具】之Andorid pthread_cancel函数
  8. java web 导出excel_javaweb导出excel表格
  9. django基础(四)详解Views视图层
  10. 朋友买的115资源系统源码
  11. 企业员工管理系统(java实现版)
  12. 火车头采集器采集教程
  13. 计算机网络安全 填空题,计算机网络安全技术选择填空复习题
  14. chm文件转换成单个html
  15. 配色(转http://huaban.com/boards/13532082/)
  16. 程序员裸辞全职接单一个月的感触
  17. Adobe Premiere Pro 2020 系统兼容性报告:不支持的视频驱动程序
  18. GE董事长兼首席执行官杰夫.伊梅尔特上任第一年致诸位股东、客户与员工(中英文)
  19. 鸟哥的linux私房菜运维篇,鸟哥的Linux私房菜学习笔记之SAMBA
  20. [bzoj5314][Jsoi2018]潜入行动_树形背包dp

热门文章

  1. 阿里云win2016服务器部署jdk+tomcat填坑
  2. 计算机类的毕业论文是怎么查重的,论文检测软件是如何实现查重功能的
  3. Android moudle库使用aar的方法
  4. WP模板兔模板V4.3 去除授权+多功能插件
  5. Android刷新UI导致崩溃的探究——Only the original thread
  6. 2018秋北京松松兄弟线下聚会干货分享
  7. Serenity框架官方文档翻译3.1(教程)
  8. 《C++语言程序设计(第4版)学生用书》课程学习(12)——第12章 异常处理
  9. 史上最全APP推广渠道
  10. 【转载】Aquanaut:水下变形金刚