字符串转数字函数 atol、atoll和strtol、strtoll、strtoul、strtoull 分析

前言

在C/C++编程中,经常会遇到将字符串转换成数值的场景需求,其实在C标准库中已经给我们提供了很多功能函数。

常用字符串转数值函数列表

头文件

#include <stdlib.h>

ato-x函数

名称含义相似功能函数
double atof(const char *nptr)将字符串转换成double值strtod(nptr, NULL)
int atoi(const char *nptr)将字符串转换成int值strtol(nptr, NULL, 10)
long atol(const char *nptr)将字符串转换成int值strtol(nptr, NULL, 10)
long long atoll(const char *nptr)将字符串转换成int值strtoll(nptr, NULL, 10)

strto-xx

名称含义
double strtod(const char *nptr, char **endptr)将字符串转换为double值
float strtof(const char *nptr, char **endptr)将字符串转换为float值
long double strtold(const char *nptr, char **endptr)将字符串转换为long值
long strtol(const char *nptr, char **endptr, int base)将字符串转换为base进制的long值
long long strtoll(const char *nptr, char **endptr, int base)将字符串转换为base进制的long long值
unsigned long strtoul(const char *nptr, char **endptr, int base)将字符串转换为base进制的unsigned long值
unsigned long long strtoull(const char *nptr, char **endptr, int base)将字符串转换为base进制的unsigned long long值

ato-x和strto-x的区别

我们以atol和strtol为例进行分析

  • atol 相对简单,只对字符串简单判断,如果第一个字符是非法字符,返回0,如果前面是有效
    数值,返回前面的数值,后面非法的不返还。
  • strtol将字符串转换为长整数,base为进制数, 如果转换成功,endptr指向字符串首地址,
    反之,则指向第一个非法字符。
  • ato-x 不会检测错误,也就是errno,而strto-x函数则会触发errno变化

编程示例

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

int main(int argc, char *argv[]) {
	const char *nptr1 = "12345678\ab";
	const char *nptr2 = "987654321012\ab";
	char *pend;
	long ltmp1, ltmp2;
	unsigned long long lltmp1, lltmp2;
	
	printf("**************************************\n");
	printf("atol strtol long test:\n");
	printf("\n");
	
	ltmp1 = atol(nptr1);
	ltmp2 = strtol(nptr1, &pend, 10);
	
	printf("ltmp1:%ld\n", ltmp1);
	printf("ltmp2:%ld  [%s]\n", ltmp2, pend);
	printf("\n");
	
	printf("**************************************\n");
	printf("atol strtol long long test:\n");
	printf("\n");
	ltmp1 = atol(nptr2);
	ltmp2 = strtol(nptr2, &pend, 10);
	printf("ltmp1:%ld\n", ltmp1);
	printf("ltmp2:%ld  [%s]\n", ltmp2, pend);
	printf("\n");
	
	printf("**************************************\n");
	printf("atoll strtoll long long test:\n");
	printf("\n");
	lltmp1 = atoll(nptr2);
	lltmp2 = strtoull(nptr2, &pend, 10);
	printf("lltmp1:%lld\n", lltmp1);
	printf("lltmp2:%lld  [%s]\n", lltmp2, pend);	
	
	return 0;
}

测试结果:
在这里插入图片描述
注意: 本例中,我们的示例字符串超过了long型范围,也就是long long。

小结

ato-x 相当于简版的strto-x函数,对于简单的应用,我们可以直接使用atoi、atof、atol、atoll函数,在linux下,尤其对于安全性要求高的,可以使用strto-x或strto-u-x函数。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值