首先我们通过man 3 strtoul命令在linux系统终端查看下该函数的原型如下

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

1.strtoul()函数的功能:
是将一个字符串最开始的部分根据base所指定的进制类型,转换成一个无符号长整型(unsigned long)或无符号长长整型(unsigned long long)数字。

注:unsigned long,unsigned long long, unsigned int 的区别

类型字节数目unsigned long在linux系统下永远是32位4字节大小unsigned int16位系统下16位两字节,32位系统下32位四字节unsigned long long在linux系统下永远是64位8字节大小

2.参数:

nptr:指向要转换为无符号长整数的字符串的指针endptr:对类型为 char*的对象的引用(也就是C语言中的二级指针),用来保存nptr所指向的字符串中第一个(非数字的字符)无效字符(invalid
character也)的地址。例如“556ga”这个字符串在本函数中第一个无效字符是g。当然,可以对该参数直接传参NULL,表示不需要记录这个无效字符。base:基数,必须介于 2 和 36(包含)之间,或者是特殊值 0。
P.S.本人逐个测试了表示2到36进制的base基数,到31是能够正常转化为数字的,但是32,33,34,35,36这五个参数却失败了。(目前没明白为何)

另外当base为特殊值0的时候,针对十六进制,十进制和八进制。可根据字符串书写情况自动识别为对应进制,详情见下表。

字符串识别进制11abcdefg十进制011abcdefg八进制0x11abcdefg十六进制

3.返回值:
正确返回转换后的长整型数,否则返回ERANGE并将错误代码存入errno中

4.范例

#include <stdlib.h>#include <stdio.h>int main(void){ char* p = “100010vaccine”; char *q; int num = strtoul(p,&q,0); printf(“num = %d\n”,num); printf(“p = %p, q = %p\n”, p, q); printf(“*p = %c, *q = %c\n”, *p, *q); return 0;}

编译运行结果如下

/*p指向字符串开头的1,q指向第一个非数字字符v,两者的关系为q = p + 6*/num = 100010p = 0x56451039f834, q = 0x56451039f83a*p = 1, *q = v

5.特殊规则
nptr所指向的字符串前面可以有任意个空格,strtoul函数会跳过字符串前面这些空格,从+,-这两个符号或者数字字符开始转换,碰到非数字字符停止。代码示例如下

#include <stdlib.h>#include <stdio.h>int main(void){char* p = ” -100010+1vaccine”;char *q;int num = strtoul(p,&q,0);printf(“num = %d\n”,num);printf(“p = %p, q = %p\n”, p, q);printf(“*p = %c, *q = %c\n”, *p, *q);return 0;}

运行结果如下

num = -100010p = 0x562b90a28834, q = 0x562b90a28844*p = , *q = +