C库函数之 strtol函数详解

本文详细介绍了C语言中的strtol函数,用于将字符串转换为long整型数值。strtol函数接受字符串、结束指针和基数作为参数,可以处理0到36进制的数值。当base为0时,根据字符串前缀判断进制。通过endptr可以获取转换后的字符串剩余部分。文中通过实例展示了如何使用strtol进行不同进制转换,并探讨了endptr在处理非法字符和多进制转换中的作用。
摘要由CSDN通过智能技术生成

在这里插入图片描述

函数声明

long int strtol (const char* str, char** endptr, int base);

参数1:str——字符串,函数会从合法的字符开始识别,之前的空格字符会被跳过,合法字符串会被转换为long int, 作为函数的返回值。
参数2:endptr——字符指针的地址,如果该参数非NULL,则保存一个指向转换值后面的第一个指针。这个指针方便对字符串剩余的部分进行处理。
参数3:base——转换所执行的基数,说人话就是,base将决定以多少进制来看待str里的字符串。

base值的可选范围:02~36

如果base为2,合法的字符就是’0’,‘1’。
对于base11到36,字母A~Z将被解释为数值10到35。
如果base为16,那么合法字符为’0’~‘9’,‘a’,‘b’,‘c’,‘d’,‘e’,‘f’。

总结:
该函数首先丢弃必要的空格字符,直到找到第一个非空格字符。然后,从这个字符开始,根据依赖于base取尽可能多的有效字符,并将它们解释为十进制数值。最后,一个指向str中整数表示后第一个字符的指针存储在endptr所指向的对象中。
例1

int main()
{
	char buffer[] = "   0110";
	int i = strtol(buffer, NULL, 2);
	printf("%d\n",i);
}

输出:
在这里插入图片描述
字符串前置的空格将会被跳过,然后根据2进制只识别字符’0’,‘1’。然后转换为10进制。


例2:

int main()
{
	char buffer[] = "   a0110";
	int i = strtol(buffer, NULL, 2);
	printf("%d\n",i);
}

输出:
在这里插入图片描述
不能执行有效的转换,返回0。


例3

int main()
{
	char buffer[] = "1033a";
	char* stop;
	int i = strtol(buffer, &stop, 2);
	printf("%d\n",i);
	printf("%s\n",stop);
}

在这里插入图片描述


例4

int main()
{
	char buffer[] = "ffg";
	char* stop;
	int i = strtol(buffer, &stop, 16);
	printf("%d\n",i);
	printf("%s\n",stop);
}

在这里插入图片描述

base为0的情况

如果base为0,一般情况下是以十进制识别str中合法的字符,即’0’-‘10’。
在这里插入图片描述
但是有两个特殊情况,
当字符串的前缀为0,base为0情况下,则与base=8的情况一样,以八进制转换字符串中的合法字符。
在这里插入图片描述
如果str前缀不是0,则base=0和base=10的结果是一样的
在这里插入图片描述
同理,如果前缀为0x(0X),则base=0和base=16效果是一样的
在这里插入图片描述
没有前缀,则base=0视为base=10
在这里插入图片描述
此时,对于十进制来说,'f’是无法识别的。
注意:当base>=34时,前缀0x中的字符’x’会被识别成数值33。
在这里插入图片描述

endptr的妙用

可将各类2~36进制数,转换为10进制

int main()
{
	
	char buffer[] = "1010 77 ff z";
	char* stop=buffer;
	int i1 = strtol(stop, &stop, 2);
	int i2 = strtol(stop, &stop, 8);
	int i3 = strtol(stop, &stop, 16);
	int i4 = strtol(stop, &stop, 36);
	printf("十进制表示为:%d,%d,%d,%d", i1, i2, i3, i4);
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值