浅析C语言中strtol()函数与strtoul()函数的用法
C语言strtol()函数:将字符串转换成long(长整型数)
头文件:
#include<stdlib.h>
strtol()函数用来将字符串转换为长整型数(long),其原型为:
longintstrtol(constchar*str,char**endptr,intbase);
【参数说明】str为要转换的字符串,endstr为第一个不能转换的字符的指针,base为字符串str所采用的进制。
【函数说明】strtol()会将参数str字符串根据参数base来转换成长整型数(long)。参数base范围从2至36,或0。参数base代表str采用的进制方式,如base值为10则采用10进制,若base值为16则采用16进制等。
strtol()会扫描参数str字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过isspace()函数来检测),直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时('\0')结束转换,并将结果返回。
两点注意:
- 当base的值为0时,默认采用10进制转换,但如果遇到'0x'/'0X'前置字符则会使用16进制转换,遇到'0'前置字符则会使用8进制转换。
- 若endptr不为NULL,则会将遇到的不符合条件而终止的字符指针由endptr传回;若endptr为NULL,则表示该参数无效,或不使用该参数。
【返回值】返回转换后的长整型数;如果不能转换或者str为空字符串,那么返回0(0L);如果转换得到的值超出longint所能表示的范围,函数将返回LONG_MAX或LONG_MIN(在limits.h头文件中定义),并将errno的值设置为ERANGE。
【示例】将字符串转换成10进制。
#include<stdio.h> #include<stdlib.h> intmain() { charszNumbers[]="200160c0c0-11011101001101001000000x6fffff"; char*pEnd; longintli1,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"); return0; }
执行结果:
转换成10进制:
2001、6340800、-3624224、7340031
C语言strtoul()函数:将字符串转换成unsignedlong(无符号长整型数)
头文件:
#include<stdlib.h>
strtoul()函数源自于“stringtounsignedlong”,用来将字符串转换成无符号长整型数(unsignedlong),其原型为:
unsignedlongstrtoul(constchar*str,char**endptr,intbase);
【参数说明】str为要转换的字符串,endstr为第一个不能转换的字符的指针,base为字符串str所采用的进制。
【函数说明】strtoul()会将参数str字符串根据参数base来转换成无符号的长整型数(unsignedlong)。参数base范围从2至36,或0。参数base代表str采用的进制方式,如base值为10则采用10进制,若base值为16则采用16进制数等。
strtoul()会扫描参数str字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过isspace()函数来检测),直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时('\0')结束转换,并将结果返回。
两点注意:
- 当base的值为0时,默认采用10进制转换,但如果遇到'0x'/'0X'前置字符则会使用16进制转换,遇到'0'前置字符则会使用8进制转换。
- 若endptr不为NULL,则会将遇到的不符合条件而终止的字符指针由endptr传回;若endptr为NULL,则表示该参数无效,或不使用该参数。本文最后的范例没有展示endptr参数的使用,你可以参考strtol()函数的范例来更加直观地了解endptr参数。
【返回值】返回转换后的无符号长整型数;如果不能转换或者str为空字符串,那么返回0;如果转换得到的值超出unsignedlongint所能表示的范围,函数将返回ULONG_MAX(在limits.h头文件中定义),并将errno的值设置为ERANGE。
温馨提示:ANSIC规范定义了stof()、atoi()、atol()、strtod()、strtol()、strtoul()共6个可以将字符串转换为数字的函数,大家可以对比学习。另外在C99/C++11规范中又新增了5个函数,分别是atoll()、strtof()、strtold()、strtoll()、strtoull(),在此不做介绍,请大家自行学习。
范例:将输入的字符串转换为无符号长整型。
#include<stdio.h> #include<stdlib.h> intmain() { charbuffer[256]; unsignedlongul; printf("Enteranunsignednumber:"); fgets(buffer,256,stdin); ul=strtoul(buffer,NULL,0); printf("Valueentered:%lu.\n",ul); system("pause"); return0; }
运行结果:
Enteranunsignednumber:017cyuyan Valueentered:15.
由于base参数被设置为0并且字符串“017cyuyan”以“0”开头,所以采用8进制转换。