技术笔记:strtol函数

简介: 技术笔记:strtol函数

strtol是一个C语言函数,包含在头文件:#include ,在c++中则是头文件


作用就是将一个字符串转换为长整型long,其函数原型为:


long int strtol (const char str, char** endptr, int base);


参数


str是要转换的字符串


endptr是指向第一个不可转换的字符位置的指针


base为基数,表示转换成为几进制的数


返回值


返回转换后的长整型数;如果不能转换或者 str 为空字符串,那么返回 0(0L);如果转换得到的值超出 long int 所能表示的范围,函数将返回 LONG_MAX 或 LONG_MIN(在 limits.h 头文件中定义),并将 errno 的值设置为 ERANGE。


注意


base的值必须是2和36(含)之间或者是特殊值0。


当 base 的值为 0 时,默认采用 10 进制转换,但如果遇到 '0x' / '0X' 前置字符则会使用 16 进制转换,遇到 '0' 前置字符则会使用 8 进制转换。


如果base的值为2到36,则将字符串转换为base的值所对应的进制的整数。


若endptr 不为NULL,则会将遇到的不符合条件而终止的字符指针由 endptr 传回;若 endptr 为 NULL,则表示该参数无效,或不使用该参数。


strtol() 会扫描参数 str 字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过 isspace() 函数来检测),直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时('\0')结束转换,并将结果返回。


如果str中的第一个非空格字符序列不是上述定义的有效整数,或者由于str为空或仅包含空白字符,则不执行转换。


如果str没有指向有效的C-字符串,或者如果endptr没有指向有效的指针对象,则会导致未定义的行为。但是这个函数从不抛出异常,在这种情况下,可能编译时并没有报错,但是生成的可执行文件无法正常运行。


示例


#include


#include


int main ()


{


char szNumbers【】 = "2001 60c0c0 -1101110100110100100000 0x6fffff";


char pEnd;


long int li1, li2, li3, li4;


li1 = strtol (szNumbers,&pEnd,10);


li2 = strtol (pEnd,&pEnd,16);


li3 = strtol (pEnd,&pEnd,2);


li4 = strtol (pEnd,NULL,0);


printf ("转换成10进制: %ld、%ld、%ld、%ld\n", li1, li2, li3, li4);


system("pause");

//代码效果参考: http://www.lyjsj.net.cn/wx/art_23146.html


return 0;


}


执行结果:


转换成10进制: 2001、6340800、-3624224、7340031


总结


结合示例,对strtol函数进行总结。


这个函数从输入的第一个不为空白字符的数字或者加减号开始识别,并且在使用这个函数之前要定义一个字符指针,这个指针也并不需要赋初值。


这个函数的第一个参数是需要转化为长整型的字符串,第二个参数是之前使用的字符指针的地址(这是因为endptr的类型是char**),第三个参数是2到36的数或者是特殊值0,函数会将相应的数字字符串,按照第三个参数中指定的进制进行识别,比如在示例中,第一个数字字符串是2001,我们的第三个参数是10,那么函数就将这个字符串转化为长整型的2001。如果第三个参数是16,那么这个“2001”就会被当做16进制的数来识别,转化为长整型的8193。这个函数成功调用后返回转化后的长整型的数。同时字符指针指向第一个数之后的非数字的字符的地址。在这个示例中,当使用完第一次strtol之后,字符指针pEnd就指向了60c0c0前面的空白字符,同时将字符串“2001”转化为长整型的2001并作为返回值。而且我们可以直接把字符指针变量作为“裁剪”之后的变量来使用,我们在第二次使用这个函数时,第一个参数设为那个字符指针变量,函数就会将60c0c0按照16进制识别并转化为长整型。


参考

相关文章
|
存储 安全 算法
Qt QSet 详解:从底层原理到高级用法
Qt QSet 详解:从底层原理到高级用法
1438 0
|
存储 Java C++
Python 教程之控制流(9)Python 中的 Switch Case(替换)
Python 教程之控制流(9)Python 中的 Switch Case(替换)
848 0
|
3月前
|
JSON 数据可视化 物联网
基于STM32和FreeRTOS的实时天气系统设计与实现【免费开源】
随着物联网(IoT)技术的发展,实时数据监测系统逐渐成为日常生活和工业环境中不可或缺的组成部分。其中,气象监测系统不仅可以提供温度、湿度、天气状况等信息,还可以通过数据分析为农业、城市管理和个人生活提供智能化建议。本项目以STM32F407为核心控制器,结合FreeRTOS实时操作系统和ESP8266 Wi-Fi模块,实现一套高可靠、实时更新的智能气象监测系统。同时,系统集成了计时功能,通过串口屏将实时数据可视化展示,为用户提供直观的操作体验。
基于STM32和FreeRTOS的实时天气系统设计与实现【免费开源】
|
8月前
|
算法 关系型数据库 测试技术
WHQL微软驱动签名方案,让驱动程序在Windows系统流畅运行
WHQL认证(Windows徽标认证)是微软设立的严格测试标准,旨在确保驱动程序的兼容性、稳定性和互通性。本文介绍了三种WHQL微软驱动签名方案:单系统签名、多系统签名和硬件兼容性测试方案,分别满足不同开发商的需求。通过WHQL认证,不仅能消除Windows安装警告,提升用户体验,还能获得“Designed for Windows”徽标授权,入列全球Windows Catalog及HCL产品表,提升品牌权威性和采购优先权。此外,访问微软OCA可获取错误反馈,助力产品质量改进。选择合适的签名方案,让驱动在Windows系统中流畅运行!
|
存储 缓存 Unix
sar命令详解
`sar`是Linux性能分析工具,用于收集和报告CPU使用率、内存、磁盘I/O、网络和进程活动等系统性能数据。基本语法:`sar [options] [interval] [count]`。例如,`sar -u 5`每5秒显示CPU使用情况。`-A`显示所有报告,`-o file`将结果保存到文件。要使用`sar`,需先安装`sysstat`包。不同发行版支持的选项可能有差异,建议查阅手册页。
374 2
|
C++
3D模型在线转换工具
NSDT 3Dconvert是一个可以进行3D模型格式转换的在线工具,并支持GLTF、GLB、OBJ、STL、STP、IGS、FBX、IFC、DXF等3D模型在线预览和转换成果下载。
2553 1
3D模型在线转换工具
|
容器
【cocos 2d微信小游戏开发教程】基础使用笔记分享(二)
【cocos 2d微信小游戏开发教程】基础使用笔记分享(二)
405 0
|
机器学习/深度学习 人工智能 算法
深度学习及CNN、RNN、GAN等神经网络简介(图文解释 超详细)
深度学习及CNN、RNN、GAN等神经网络简介(图文解释 超详细)
2229 1
|
Java Maven
关于maven标签产生content type is element-only问题解决方案
这是一个简单的小问题,日常使用maven的时候不注意容易犯的一个错误
1421 0
关于maven标签产生content type is element-only问题解决方案
|
存储 编解码 内存技术
RTMP协议详解及Wiresahrk抓包分析(二)
RTMP协议详解及Wiresahrk抓包分析
405 0