技术笔记: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进制识别并转化为长整型。


参考

相关文章
|
9月前
|
存储 缓存 安全
C++数组全解析:从基础知识到高级应用,领略数组的魅力与技巧
C++数组全解析:从基础知识到高级应用,领略数组的魅力与技巧
228 1
|
C++
24.【特殊函数篇==(十篇一章,持续更新~)】(一)
24.【特殊函数篇==(十篇一章,持续更新~)】
62 0
|
3月前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!
|
3月前
|
存储 机器学习/深度学习 搜索推荐
Python编程入门:从零开始构建你的第一个程序
【10月更文挑战第32天】本文旨在通过浅显易懂的方式引导编程新手进入Python的世界。我们将一起探索Python的基础语法,并通过实例学习如何构建一个简单的程序。文章将不直接展示代码,而是鼓励读者在阅读过程中自行尝试编写,以加深理解和记忆。无论你是编程初学者还是希望巩固基础知识的开发者,这篇文章都将是你的良师益友。让我们开始吧!
|
5月前
|
Python
探索Python编程的奥秘:打造你的第一个程序
【9月更文挑战第8天】本文将带你进入Python编程的世界,通过一个有趣的项目——制作一个简单的猜数字游戏,让你快速入门。我们不仅会分享代码编写的步骤,还会讲解每一行代码的含义和作用,确保即使是编程新手也能跟上节奏。文章末尾附有完整代码,方便读者实践和学习。
43 12
|
6月前
|
存储 编译器 数据处理
【编程秘籍】解锁C语言数组的奥秘:从零开始,深入浅出,带你领略数组的魅力与实战技巧!
【8月更文挑战第22天】数组是C语言中存储同类型元素的基本结构。本文从定义出发,详述数组声明、初始化与访问。示例展示如何声明如`int numbers[5];`的数组,并通过下标访问元素。初始化可在声明时进行,如`int numbers[] = {1,2,3,4,5};`,编译器自动计算大小。初始化时未指定的元素默认为0。通过循环可遍历数组,数组名视为指向首元素的指针,方便传递给函数。多维数组表示矩阵,如`int matrix[3][4];`。动态数组利用`malloc()`分配内存,需用`free()`释放以避免内存泄漏。掌握这些技巧是高效数据处理的基础。
85 2
|
9月前
|
存储 程序员 C语言
【C 言专栏】C 语言指针的深度解析
【4月更文挑战第30天】C 语言中的指针是程序设计的关键,它如同一把钥匙,提供直接内存操作的途径。指针是存储其他变量地址的变量,通过声明如`int *ptr`来使用。它们在动态内存分配、函数参数传递及数组操作中发挥重要作用。然而,误用指针可能导致错误,如空指针引用和内存泄漏。理解指针的运算、与数组和函数的关系,以及在结构体中的应用,是成为熟练 C 语言程序员的必经之路。虽然挑战重重,但掌握指针将增强编程效率和灵活性。不断实践和学习,我们将驾驭指针,探索更广阔的编程世界。
92 12
|
9月前
|
前端开发
前端知识笔记(十一)———拓展运算符
前端知识笔记(十一)———拓展运算符
112 0
R语言笔记丨字符串和列表必学基础知识
R语言笔记丨字符串和列表必学基础知识
|
算法 数据处理 索引
【Python 小白到精通 | 课程笔记】第三章:数据处理就像侦探游戏(函数和包)
【Python 小白到精通 | 课程笔记】第三章:数据处理就像侦探游戏(函数和包)
268 0
【Python 小白到精通 | 课程笔记】第三章:数据处理就像侦探游戏(函数和包)