strtol全面解析

基本简介: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值