linux库函数strtoul简介

首先我们通过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 = 100010
p = 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 = -100010
p = 0x562b90a28834, q = 0x562b90a28844
*p =  , *q = +

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值