当前位置:C语言 -- 标准库 -- <stdlib.h> -- strtoul

strtoul函数


概要:
#include <stdlib.h>
unsigned long int strtoul(
      const char * restrict nptr,
      char ** restrict endptr,
      int base);

描述:

该函数将参数nptr指向字符串的初始部分转换为unsigned long int类型整数。

该函数首先将字符串分成三个部分:

1、一个初始的、可能为空的空格字符(可以使用isspace函数检查。)序列;

2、一个类似整数(参数base确定其基数。)的主题序列;

3、由一个或者多个未识别字符组成的最终字符串(final string),包括字符串末尾的终止空字符;

然后尝试将主题序列转换为整数,并返回结果。


如果参数base值为0,主题序列的预期形式是ISO/IEC 9899:2018标准第6.4.4.1 Integer constants节中描述的整数常量的形式(即主题序列可能是十进制、八进制或者十六进制形式。);主题序列前可能存在+号或者-号,但主题序列不包括整数后缀。

如果参数base值在236之间(包括236。),主题序列的预期形式是一个由字母和数字构成的表示整数的序列,参数base确定其基数;主题序列前可能存在+号或者-号,但主题序列不包括整数后缀。字母az(或者字母AZ)表示值1035。只有当字母和数字的值小于参数base值时,字母和数字才是有效的。如果参数base值为16,字符0x或者0X是可选的;如果存在字符0x或者0X,其位置应在符号之后,字母和数字序列之前。


主题序列从第一个非空格字符开始,包含符合上述形式的尽可能多字符的最长初始子序列。如果字符串为空,或者如果字符串完全由空格字符组成,或者如果第一个非空格字符不是符号,也不是允许的字母或者数字,主题序列将不包含任何字符。

如果主题序列具有预期形式,并且参数base值为0,从第一个数字开始的字符序列将根据ISO/IEC 9899:2018标准第6.4.4.1 Integer constants节的规则解释为整数常量。

如果主题序列具有预期形式,并且参数base值在236之间(包括236。),参数base将用作转换的基数,字母根据上述规则(即字母az(或者字母AZ)表示值1035。)获取值。

如果主题序列以-号开头,转换得到的值会被取反。


如果参数endptr不是空指针,指向最终字符串的指针存储在参数endptr指向的对象中。

非“C”语言环境中,还可以接受特定语言环境的主题序列。

如果主题序列为空或者不符合预期形式,将不进行任何转换;参数nptr的值将存入参数endptr指向的对象中(前提是参数endptr不是空指针。)。


参数:
const char * restrict nptr

char类型指针,指向被转换的字符串。

char ** restrict endptr

指向一个char *类型对象的指针,指向对象值为字符串中数字值之后的下一个字符的地址。该参数也可以是一个空指针,这种情况下它不会被使用。

int base

基数,决定了有效字符及其解释。


返回值:

如果发生转换,函数返回转换后的值;如果没有发生转换,函数返回0。如果转换结果超出返回类型所能表示的范围,函数返回ULONG_MAX,并将errno设置为ERANGE


范例:
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
/*函数strtoul范例*/

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char str[] = "-2017 0101 0x1a1a +6982 abc";
    char *ptr = str;
    unsigned long int number;

    do
    {
        number = strtoul(ptr, &ptr, 16);
        printf("%lu\n", number);
    }while((ptr-str)<sizeof(str)-1);

    return 0;
}


输出:

4294959081

257

6682

27010

2748


这里解释一下-2017为什么转换成4294959081?编译时所用编译器中unsigned long int类型占用4个字节,2017序列转换得到十六进制形式为0000 2017,由于前面有-号,所以会对其取反,得到十六进制数ffff dfe9,这个数换算成十进制就是4294959081-2017转换得到的值与具体实现有关。


相关内容:
strtol 将字符串转换为long int类型整数的函数。
strtoull 将字符串转换为unsignd long long int类型整数的函数。
atol 将字符串转换为long int类型十进制整数的函数。