================================================================================
1.函数原型
unsigned long int strtoul(const char *nptr, char **endptr, int base);
unsigned long long int strtoull(const char *nptr, char **endptr,int base);
1、参数nptr:字符串的起始地址。
2、参数endptr: 返回字符串有效数字的结尾地址。如 123456fe789 则返回数字f的地址。
3、参数base:转化基数。
参数 base 范围从2 至36,或0。
参数 base 代表 nptr 采用的进制方式,如 base 值为10 则采用 10 进制,若 base 值为16 则采用16 进制数等。
2.功能描述
convert a string to an unsigned long integer(把输入的字符串转换成数字).
strtoul() 会扫描参数nptr 字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过 isspace() 函数来检测),直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时(’\0’)结束转换,并将结果返回。
3.所需头文件
#include <stdlib.h>
4.注意两点
1、当 base 的值为 0 时,默认采用 10 进制转换,但如果遇到 '0x' / '0X' 前置字符则会使用 16 进制转换,
遇到 '0' 前置字符则会使用 8 进制转换。
2、若 endptr 不为NULL,则会将遇到的不符合条件而终止的字符指针由 endptr 传回;若 endptr 为 NULL,
则表示该参数无效,或不使用该参数。本文最后的范例没有展示 endptr 参数的使用,
你可以参考 strtol() 函数的范例来更加直观地了解 endptr 参数。
5.示例
实例一
输入字符串,base 的值为2,二进制转换。
#include <stdio.h>
#include <stdlib.h>
int main ()
{
char buffer [256];
unsigned long ul;
char * endptr;
while(1)
{
printf ("Enter an unsigned number: ");
fgets (buffer, 256, stdin);
ul = strtoul (buffer, &endptr, 2);
printf ("Value entered: %lu ,the address of the first invalid character is %d ,invalid character=%s\n", ul,endptr,endptr);
system("pause");
}
return 0;
}
测试结果:
实例二:
输入字符串,base 的值为10,十进制转换。
#include <stdio.h>
#include <stdlib.h>
int main ()
{
char buffer [256];
unsigned long ul;
char * endptr;
while(1)
{
printf ("Enter an unsigned number: ");
fgets (buffer, 256, stdin);
ul = strtoul (buffer, &endptr, 10);
printf ("Value entered: %lu ,the address of the first invalid character is %d ,invalid character=%s\n", ul,endptr,endptr);
system("pause");
}
return 0;
}
测试结果:
实例三:
输入字符串,base 的值为0的特殊情况。
1、当 base 的值为 0 时,默认采用 10 进制转换,但如果遇到 ‘0x’ / ‘0X’ 前置字符则会使用 16 进制转换,遇到 ‘0’ 前置字符则会使用 8 进制转换。
2、若 endptr 不为NULL,则会将遇到的不符合条件而终止的字符指针由 endptr 传回;若 endptr 为 NULL,则表示该参数无效,或不使用该参数。本文最后的范例没有展示 endptr 参数的使用,你可以参考 strtol() 函数的范例来更加直观地了解 endptr 参数。
#include <stdio.h>
#include <stdlib.h>
int main ()
{
char buffer [256];
unsigned long ul;
char * endptr;
while(1)
{
printf ("Enter an unsigned number: ");
fgets (buffer, 256, stdin);
ul = strtoul (buffer, &endptr, 0);
printf ("Value entered: %lu ,the address of the first invalid character is %d ,invalid character=%s\n", ul,endptr,endptr);
system("pause");
}
return 0;
}
测试结果:
————————————————
版权声明:本文为CSDN博主「海月汐辰」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37858386/article/details/78458401
6.补充说明
strtol, strtoll, strtoul, strtoull
convert a string to a (signed, unsigned ) long integer string
声明:
#include<stdlib.h> ( 这个是C标准库,与linux无关。这套函数是通用的。)
long int strtol(const char *nptr, char **endptr, int base);
long long int strtoll(const char *nptr, char **endptr, int base);
unsigned long int strtoul(const char *nptr, char **endptr, int base);
unsigned long long int strtoull(const char *nptr, char **endptr, int base);
说明,第一个参数 nptr是要转化的字符串。第三个参数base说明nptr的进制。base 取值范围 0,2-36
这几个函数会忽略nptr前面的空格( ’ ‘, ‘\t’, ‘\n’ ‘\f’, ‘\v’ ‘\r’ ,由isspace判定为真的字符)
while (*nptr && isspace ( *nptr ) ) ++ nptr;
然后遇到非合法字符结束;
base = 2; 合法字符为0, 1
base = 3; 合法字符为0,1, 2
…
base = 11; 合法字符为0,1,…,9,a(A)
…
base = 36;合法字符为0, 1, …,9,a(A),…,z(Z)。
字符 a-z,是忽略大小写的,混着来也行,例如 strtol(“aA”, NULL, 11)依然能得到正确的结果。
函数的第二个参数endptr可以为空,如果不为空,则 endptr 保存函数结束前的那个非合法字符的地址。
如果没有合法字符,则 *endptr = nptr,函数返回0.
例如:
1.
char *endptr;
char nptr[]=“123abc”;
int ret = strtol(nptr, &endptr, 10 );
由于10进制里没有“数字”a,所以扫描到a,结束。
这样 ret = 123;
endptr = &nptr[3]; ( printf("%s", endptr);将得到字符串 abc )
2.
char nptr[]=" \n\t abc";
int ret = strtol(nptr, &endptr, 10 );
由于函数会忽略nptr前面的空格(’ ', ‘\n’…),所以,从字符a开始扫描,但是遇见的“第一个”即是不合法字符。
所以函数结束。 ret=0; endptr = nptr;
以下的讨论,会认为 nptr 前面没有空格,
即执行过类似于while (*nptr &&isspace ( *nptr ) ) ++ nptr;
如果base 为0.则分3种情况:
如果nptr 以0x(零x)开头,则把nptr当成16进制处理。
如果npstr以0(零)开头,则把nptr当成8进制处理。
否则,把nptr当成10进制。
对于函数执行错误,如传了一个非合法base,则errno会设置相关值