atoi atol实现
看了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源码:
- long __cdecl atol(
- const char *nptr
- )
- {
- int c; /* current char */
- long total; /* current total */
- int sign; /* if '-', then negative, otherwise positive */
- /* skip whitespace */
- while ( isspace((int)(unsigned char)*nptr) )
- ++nptr;
- c = (int)(unsigned char)*nptr++;
- sign = c; /* save sign indication */
- if (c == '-' || c == '+')
- c = (int)(unsigned char)*nptr++; /* skip sign */
- total = 0;
- while (isdigit(c)) {
- total = 10 * total + (c - '0'); /* accumulate digit */
- c = (int)(unsigned char)*nptr++; /* get next char */
- }
- if (sign == '-')
- return -total;
- else
- return total; /* return result, negated if necessary */
- }
int atoi(const char *nptr)
{
return (int)atol(nptr);
}
atoi atol实现相关推荐
- 相关函数: atof, atoi, atol, strtod, strtoul
strtod() //字符串转为 double strtof() //字符串转为 float strtols() //字 ...
- C语言atof,atoi,atol函数用法详解和main函数2个参数的使用详解
#include <stdlib.h> 三个都是这个库里面的函数 atof()函数用于将字符串转换为浮点数. 语法: double atof (const char* str); 参数: ...
- C语言 字符串与整数的相互转换(atoi/atol/sprintf函数简解)
字符串转化为整数 atoi函数与atol函数 atol函数是将字符串转化为整形,atol函数是将字符串转化为长整型 注意:其实他们没什么区别. int main() {printf("siz ...
- 类型转换函数(atof(),atoi(),atol())
头文件 类型转换函数的头文件为stdlib.h 1:atof()函数 函数原型:double atof(const char *s); 函数功能:字符串转换为浮点型 2:ayoi()函数 函数原型:i ...
- c语言 atol,C语言的常用类型转换函数(atoi,atol,strtod,strtol,strtoul)
51Testing软件测试网W;cn2Jl^? atof(将字符串转换成浮点型数)51Testing软件测试网 I,g6C_$EP 相关函数51Testing软件测试网t9n3x]Z atoi,ato ...
- time,atoi,strstr
几个简单的C函数,平时用的比较少.虽然简单,但还是比较陌生. #include<stdio.h> #include<time.h> #include<stdlib.h&g ...
- atoi函数_C语言字符串、数字转换函数大全!
常用到字符串和数字的转换 想找却发现网上的资料太散 所以搜集整理一下,方便给大家以后再用 atof(将字符串转换成浮点型数) atoi(将字符串转换成整型数) atol(将字符串转换成长整型数) st ...
- atol的实现【转】
本文转载自:http://blog.csdn.net/cwqbuptcwqbupt/article/details/7518582 看了atol的实现,发现char到int的转换比较奇怪:c = (i ...
- itoa函数和atoi函数的实现和用法
itoa函数和atoi函数的用法 参考网址:http://wenhaidongke.blog.163.com/blog/static/12807009020098213576224/ C语言提供了几个 ...
最新文章
- 在报文摘要算法MD5中,首先要进行明文分组与填充,其中分组时明文报文摘要按照(42)位分组。【答案】C
- 最新 Windows 7 7100安装
- 《3D Math Primer for Graphics and Game Development》读书笔记1
- java clone方法_Java Calendar clone()方法与示例
- 利用营销工具,这家企业从按经验办事的老中医,变为数据化中西医
- android 正在上传动画,安卓系统上传文件动态显示进度条,进度条经常卡在99%有时也会卡住不显示完整的文字。...
- 【编译工具】之Andorid pthread_cancel函数
- java web 导出excel_javaweb导出excel表格
- django基础(四)详解Views视图层
- 朋友买的115资源系统源码
- 企业员工管理系统(java实现版)
- 火车头采集器采集教程
- 计算机网络安全 填空题,计算机网络安全技术选择填空复习题
- chm文件转换成单个html
- 配色(转http://huaban.com/boards/13532082/)
- 程序员裸辞全职接单一个月的感触
- Adobe Premiere Pro 2020 系统兼容性报告:不支持的视频驱动程序
- GE董事长兼首席执行官杰夫.伊梅尔特上任第一年致诸位股东、客户与员工(中英文)
- 鸟哥的linux私房菜运维篇,鸟哥的Linux私房菜学习笔记之SAMBA
- [bzoj5314][Jsoi2018]潜入行动_树形背包dp
热门文章
- 阿里云win2016服务器部署jdk+tomcat填坑
- 计算机类的毕业论文是怎么查重的,论文检测软件是如何实现查重功能的
- Android moudle库使用aar的方法
- WP模板兔模板V4.3 去除授权+多功能插件
- Android刷新UI导致崩溃的探究——Only the original thread
- 2018秋北京松松兄弟线下聚会干货分享
- Serenity框架官方文档翻译3.1(教程)
- 《C++语言程序设计(第4版)学生用书》课程学习(12)——第12章 异常处理
- 史上最全APP推广渠道
- 【转载】Aquanaut:水下变形金刚