基本简介:C 库函数 long int strtol(const char *str, char **endptr, int base) 把参数 str 所指向的字符串根据给定的 base 转换为一个长整数(类型为 long int 型),base 必须介于 2 和 36(包含)之间,或者是特殊值 0。
详细解释:long int strtol (const char *str, char **endptr, int base)
strtol()会将str指向的字符串,根据参数base,按权转化为long int, 然后返回这个值。
这里从转换后的返回值都是十进制的,其中的base参数指的是以什么进制解析str所指向的字符串
参数base的范围为2~36,和0;它决定了字符串以被转换为整数的权值。
可以被转换的合法字符依据base而定,举例来说,当base为2时,合法字符为‘0’,‘1’;base为8时,合法字符为‘0’,‘1’,……‘7’;base为10时,合法字符为‘0’,‘1’,……‘9’;base 为16时,合法字符为‘0’,‘1’,……‘9’,‘a’,……‘f’;base为24时,合法字符为‘0’,……‘9’,‘a’,……‘n’,base为36时,合法字符为‘0’,……‘9’,‘a’,……‘z’;等等。其中,不区分大小写,比如,‘A’和‘a’会都会被转化为10。
当字符合法时,‘0’,……‘9’依次被转换为十进制的0~9,‘a’,……‘z’一次北转换为十进制的10~35。
这里的合法是指比如base等于16,则0,1,…9,a,…,f为合法字符,其他都为非法字符
strtol检测到第一个非法字符时,立即停止检测,其后的所有字符都会被当作非法字符处理。合法字符串会被转换为long int, 作为函数的返回值。非法字符串,即从第一个非法字符的地址,被赋给endptr。即endptr为非法字符串。
下面可以看几个示例:
示例1
int main()
{
char buffer[20]="10379cend$3";
char *stop;
printf("%d\n",strtol(buffer, &stop, 2)); //2
cout << stop << endl; //379cend$3
return 0;
}
输出结果:
2
379cend$3
示例2
int main()
{
char buffer[20]="10379cend$3";
char *stop;
printf("%d\n",strtol(buffer, &stop, 10)); //10379
cout << stop << endl; //cend$3
return 0;
}
输出结果:
10379
cend$3
示例3
int main()
{
char buffer[20]="10379cend$3";
char *stop;
printf("%d\n",strtol(buffer, &stop, 16)); //17005006
cout << stop << endl; //nd$3
return 0;
}
输出结果:
17005006
nd$3
以上三个示例说明了base的作用。
最后再补充一下关于endptr为NULL、0、nullptr的情况,据我所参考的博客,大多数的说法是“多数情况下,endptr设置为NULL, 即不返回非法字符串。”,我没有明白这句话的意思,但是根据我的实验代码如下可说明具体的用法(以下base均为10):
示例endptr = 0
int main()
{
char buffer[20]="10379cend$3";
char *stop = 0;
printf("%d\n",strtol(buffer, &stop, 10)); //10379
cout << stop << endl; //cend$3
return 0;
}
输出结果:
10379
cend$3
示例endptr = NULL
int main()
{
char buffer[20]="10379cend$3";
char *stop = NULL;
printf("%d\n",strtol(buffer, &stop, 10)); //10379
cout << stop << endl; //cend$3
return 0;
}
输出结果:
10379
cend$3
示例endptr = nullptr
int main()
{
char buffer[20]="10379cend$3";
char *stop = nullptr;
printf("%d\n",strtol(buffer, &stop, 10)); //10379
cout << stop << endl; //cend$3
return 0;
}
输出结果:
10379
cend$3
以上可知,当endptr被设置为0, NULL,nullptr时,所起的作用与其他一样。
关于0、nullptr、NULL区别见我后续文章。
拓展示例
int main()
{
const char *ch = "5500";
char *endptr = 0;
// const char *ch1 = "";
// if (*ch1 == 0)
// cout << true << endl;
auto a = strtol(ch, &endptr, 10); //a = 5500
cout << a << endl;
cout << endptr << endl; //此处endptr = "",因为5500后为空,没有非法字符串
if (*endptr == 0) //endptr = "", 所以*endptr = 0
cout << "true" << endl;
system("pause");
return 0;
}
参考链接1https://www.cnblogs.com/lzjsky/archive/2011/01/05/1926369.html
参考链接2https://www.runoob.com/cprogramming/c-function-strtol.html