在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 = "12345678ab";const char *nptr2 = "987654321012ab";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:%ldn", 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:%ldn", 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:%lldn", 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函数。