字符串转整数,不仅是面试题常考题目,也是日常常用函数。这里对其中的区别做一个备注,便于以后查看。
一、字符串转整数
一般使用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表述用户想将字符串转为的进制数,有效值可以设置从0
或2到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()