C语言 strtol() 函数用法

strtol 是 C 标准库中的一个重要函数,用于将字符串转换为长整数。下面解释这个函数:

函数原型

long int strtol(const char* str, char** endptr, int base);

参数说明

1. str - 要转换的字符串

  • 指向【以 null 结尾的字符串】的指针(非常重要:请确保输入字符串以 null 结尾)

  • 函数会跳过前面的空白字符

2. endptr - 结束指针(可选)

(主要的作用:用于输入错误检测)

  • 如果非 NULL,函数会将第一个无效字符的地址存储在这里

  • 如果为 NULL,则忽略此信息

3. base - 进制基数

  • 2-36:指定转换的进制

  • 0:自动检测进制(根据字符串前缀)

    • 0x 或 0X:十六进制

    • 0:八进制

    • 其他:十进制

返回值

  • 成功:转换后的长整数值

  • 失败:0 或 LONG_MAX/LONG_MIN(溢出时)

  • 设置 errno 来指示错误类型

使用示例

1. 基本转换

#include <stdlib.h>
#include <stdio.h>

int main() {
    const char* str1 = "12345";
    const char* str2 = "0x1A3F";
    const char* str3 = "1010";
    
    //指定字符串和进制,进行数字的转换
    long num1 = strtol(str1, NULL, 10);  // 十进制: 12345
    long num2 = strtol(str2, NULL, 0);   // 自动检测: 6719
    long num3 = strtol(str3, NULL, 2);   // 二进制: 10
    
    //打印结果以十进制显示
    printf("num1 = %ld\n", num1);//结果:12345
    printf("num2 = %ld\n", num2);//结果:6719
    printf("num3 = %ld\n", num3);//结果:10
    
    return 0;
}

2. 使用 endptr 检测转换结果下载

#include <stdlib.h>
#include <stdio.h>

int main() {
    const char* str = "123abc";
    char* endptr;
    
    long num = strtol(str, &endptr, 10);
    
    printf("转换的数字: %ld\n", num);    // 123
    printf("剩余字符串: \"%s\"\n", endptr); // "abc"
    printf("转换的字符数: %td\n", endptr - str); // 3
    
    return 0;
}

3. 错误处理

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <limits.h>

int main() {
    const char* str1 = "99999999999999999999"; // 超出 long 范围
    const char* str2 = "invalid";
    char* endptr;
    
    errno = 0; // 重置错误标志
    long num1 = strtol(str1, &endptr, 10);
    
    if (errno == ERANGE) {
        printf("数值超出范围\n");
        if (num1 == LONG_MAX)
            printf("上溢发生\n");
        else if (num1 == LONG_MIN)
            printf("下溢发生\n");
    }
    
    errno = 0;
    long num2 = strtol(str2, &endptr, 10);
    
    if (endptr == str2) {
        printf("没有数字被转换\n");
    }
    
    return 0;
}

在原代码中的应用

outputArray[outputSize++] = strtol(byteStr, nullptr, 16);

这里的使用:

  • byteStr:包含两个十六进制字符的字符串(如 "1A")

  • nullptr:不关心结束位置

  • 16:明确指定十六进制转换

转换过程:

  • "1A" → 1*16 + 10 = 26 → 0x1A

  • "FF" → 15*16 + 15 = 255 → 0xFF

  • "00" → 0*16 + 0 = 0 → 0x00

相关函数家族

 
函数 返回类型 说明
strtol long 转换到长整数
strtoll long long 转换到长长整数
strtoul unsigned long 转换到无符号长整数
strtod double 转换到双精度浮点数
atoi int 简单转换(不检查错误)

重要注意事项

  1. 错误处理:总是检查 errno 和 endptr

  2. 边界检查:确保输入字符串以 null 结尾

  3. 进制选择:使用 0 让函数自动检测通常更安全

  4. 性能:比 atoi 慢但更安全,支持错误检测

strtol 是一个强大而灵活的函数,特别适合需要健壮错误处理的场景。

 
 
 
 
 
posted @ 2025-10-09 00:43  FBshark  阅读(19)  评论(0)    收藏  举报