【C/C++】字符串转数字

字符串转整数,不仅是面试题常考题目,也是日常常用函数。这里对其中的区别做一个备注,便于以后查看。

一、字符串转整数

一般使用atoi或者strtol,其中strtol功能会更强一些

// atoi函数原型
#include <stdlib.h>
int atoi(const char *nptr);

// strtol函数原型
#include <stdlib.h>
long int strtol(const char *nptr, char **endptr, int base);

正常的转换是等价的,忽略前置空白符,将字符串转换为数字。当遇到非数字的字符则截断,不会报错。例如:

atoi("123");//结果:123
atoi("123abc");//结果:123
atoi("   123abc");//结果:123

strtol("123", NULL, 10); //结果:123
strtol("123abc", NULL, 10); //结果:123
strtol("   123abc", NULL, 10); //结果:123

这里重点讲一下strtol的特殊用法,主要有两个:
1、endptr参数
一般情况下,我们不关心这个参数,所以默认填写NULL。
那什么时候启用呢?当想判断字符串是否完全转化的时候启用,此时endptr会指向第一个不能被处理(非数字和标点)的字符。具体示例如下:

char psz[] = "123abc";
char* endptr = NULL;

printf("%ld\n", strtol(psz, &endptr, 10));  //输出:123
printf("%s\n", endptr);  //此时endptr指向第一个不能被处理的整数'a'字符,所以输出:abc

2、base参数
base表述用户想将字符串转为的进制数,有效值可以设置从02到36
0值需要特殊说明下,默认采用十进制转换,但如果遇到'0x'/'0X'前置字符会使用16进制转换,遇到'0'前置字符会使用8进制进行转换。示例如下:

char psz[] = "16";
printf("%ld\n", strtol(psz,  NULL, 7":));  //13

其他类似的函数如下:
ANSI C规范定义了stof(), atoi(), atol(), strtod(), strtol(), strtoul()等6个可以将字符串转换为数字的函数。
C99/C++11规范中又分别增加了5个函数,分别是atoll(), strtof(), strtold(), strtoll(), strtoull()

推荐阅读更多精彩内容