前言
在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函数。