C 语言中,strtol()(string to long)是一个强大且安全的字符串解析函数,它用于将字符串转换为 long 类型整数,同时提供错误检测的能力。strtol() 是 C 语言解析整数的推荐方式,比 atoi() 更安全,支持错误检测和多进制。在实际项目中,优先使用 strtol(),避免 atoi() 带来的错误隐患。

1、strtol() 函数原型

strtol() 在 头文件中定义。

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

1)参数

参数描述
nptr输入的 C 字符串。
endptr如果 endptr 不为 NULL
strtol() 会存储
第一个无效字符的指针到 *endptr
base转换的进制,支持 236 之间的进制。
如果 base 设为 0strtol() 会自动检测:
1) 0x0X 开头 → 16 进制
2) 0 开头 → 8 进制
3) 其他 → 10 进制

2)返回值

成功时返回转换后的 long 整数。如果无法转换,返回 0,并且 endptr 指向 nptr。如果溢出,返回 LONG_MAX LONG_MIN,并设置 errno ERANGE

2、strtol() 的使用

1)转换字符串为整数

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

int main() {
    char str[] = "12345";
    char *endptr;
    long num = strtol(str, &endptr, 10);

    printf("转换后的数值: %ld\n", num);
    printf("未转换部分: %s\n", endptr);

    return 0;
}

2)处理无效输入

如果 strtol() 遇到无效的数字,它不会触发错误,而是返回 0,并让 endptr指向第一个无法解析的字符。

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

int main() {
    char str[] = "abc123";
    char *endptr;
    long num = strtol(str, &endptr, 10);

    if (endptr == str) {
        printf("错误: 不能转换 '%s' 为数字\n", str);
    } else {
        printf("转换后的数值: %ld\n", num);
        printf("未转换部分: %s\n", endptr);
    }

    return 0;
}

3)处理部分有效输入

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

int main() {
    char str[] = "42xyz";
    char *endptr;
    long num = strtol(str, &endptr, 10);

    printf("转换后的数值: %ld\n", num);
    printf("未转换部分: %s\n", endptr);

    return 0;
}

4)处理溢出

如果解析的值超出了 long 的范围,strtol() 会返回 LONG_MAXLONG_MIN,并设置 errno = ERANGE

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

int main() {
    char str[] = "999999999999999999999";
    char *endptr;
    errno = 0;  // 重置 errno
    long num = strtol(str, &endptr, 10);

    if (errno == ERANGE) {
        printf("错误: 数值超出范围\n");
    } else {
        printf("转换后的数值: %ld\n", num);
    }

    return 0;
}

5)strtol() 处理不同进制

strtol() 可以解析 二进制、八进制、十六进制 等。

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

int main() {
    char hex[] = "0x1A";
    char bin[] = "1010";
    char oct[] = "075";
    
    printf("十六进制: %ld\n", strtol(hex, NULL, 0));  // 自动检测
    printf("二进制 (手动指定): %ld\n", strtol(bin, NULL, 2));
    printf("八进制: %ld\n", strtol(oct, NULL, 0));

    return 0;
}

3、strtol() 和 atoi()

strtol()atoi() 都是 C 语言用于将字符串转换为整数的函数,但它们在功能和使用上有较大的不同。优先使用 strtol(),因为它支持更多功能,并提供错误检测,适用于健壮性要求更高的程序。atoi() 适用于简单的情况,如确定字符串一定是有效整数,并且不需要错误检测。

1)strtol()

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

int main() {
    const char *str = "123abc";
    char *endptr;
    long num = strtol(str, &endptr, 10);

    if (errno == ERANGE) {
        printf("Overflow or underflow occurred!\n");
    } else if (endptr == str) {
        printf("No digits found!\n");
    } else {
        printf("Converted number: %ld\n", num);
        printf("Remaining string: %s\n", endptr);
    }

    return 0;
}

2)atoi()

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

int main() {
    const char *str = "123abc";
    int num = atoi(str);

    printf("Converted number: %d\n", num);

    return 0;
}

推荐文档

相关文档

大家感兴趣的内容

随机列表