C语言16进制转10进制函数怎么写?

99ANYc3cd6
预计阅读时长 10 分钟
位置: 首页 C语言 正文

在C语言中,将16进制字符串转换为10进制整数,可以使用标准库函数strtol(),也可以手动编写转换函数,以下是两种方法的实现:

c语言16进制转10进制 函数
(图片来源网络,侵删)

方法1:使用标准库函数 strtol()

strtol() 是一个强大的函数,可以将字符串转换为长整型(long),并支持多种进制(如16进制)。

函数原型:

long strtol(const char *str, char **endptr, int base);
  • str:要转换的字符串。
  • endptr:用于存储转换后剩余部分的指针(可选,可设为NULL)。
  • base:进制数(16表示16进制)。

示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
    char hexStr[] = "1A3F"; // 16进制字符串
    long decimalValue;
    // 使用strtol转换
    decimalValue = strtol(hexStr, NULL, 16);
    printf("16进制 %s 转换为10进制是: %ld\n", hexStr, decimalValue);
    return 0;
}

输出:

16进制 1A3F 转换为10进制是: 6719

注意事项:

  1. 字符串必须以合法的16进制字符开头(如0x前缀或数字0-9、字母A-F/a-f)。
  2. 如果转换失败,strtol()会返回0,并设置errnoEINVAL(需检查errno)。
  3. 如果结果超出long范围,行为未定义(需检查errno是否为ERANGE)。

方法2:手动编写转换函数

如果不想依赖strtol(),可以手动实现16进制到10进制的转换。

实现逻辑:

  1. 遍历字符串的每个字符。
  2. 将字符转换为对应的数值(如'A'→10,'F'→15)。
  3. 累加结果:result = result * 16 + current_digit

示例代码:

#include <stdio.h>
#include <ctype.h> // 用于tolower()
int hexCharToInt(char c) {
    c = tolower(c); // 统一转为小写
    if (c >= '0' && c <= '9') return c - '0';
    if (c >= 'a' && c <= 'f') return c - 'a' + 10;
    return -1; // 非法字符
}
long hexToDecimal(const char *hexStr) {
    long result = 0;
    for (int i = 0; hexStr[i] != '\0'; i++) {
        int digit = hexCharToInt(hexStr[i]);
        if (digit == -1) {
            printf("错误:非法字符 '%c'\n", hexStr[i]);
            return -1; // 返回-1表示错误
        }
        result = result * 16 + digit;
    }
    return result;
}
int main() {
    char hexStr[] = "1A3F";
    long decimalValue = hexToDecimal(hexStr);
    if (decimalValue != -1) {
        printf("16进制 %s 转换为10进制是: %ld\n", hexStr, decimalValue);
    }
    return 0;
}

输出:

c语言16进制转10进制 函数
(图片来源网络,侵删)
16进制 1A3F 转换为10进制是: 6719

注意事项:

  1. 手动实现需要处理非法字符(如非16进制字符)。
  2. 如果输入字符串为空或全非法字符,应返回错误(如-1)。
  3. 同样需要检查数值范围是否超出long的限制。

方法3:使用 sscanf()(简单场景)

如果只是简单的转换且不需要错误处理,可以用sscanf()

#include <stdio.h>
int main() {
    char hexStr[] = "1A3F";
    long decimalValue;
    sscanf(hexStr, "%lx", &decimalValue); // %lx表示16进制long
    printf("16进制 %s 转换为10进制是: %ld\n", hexStr, decimalValue);
    return 0;
}

输出:

16进制 1A3F 转换为10进制是: 6719

注意事项:

  • sscanf()不会报告错误,如果字符串非法,结果可能为0或未定义。

方法 优点 缺点
strtol() 功能强大,支持错误检查 需要处理errnoendptr
手动实现 完全可控,适合学习算法 需要自行处理错误和边界情况
sscanf() 代码简单 无错误处理,不推荐生产环境使用

推荐使用strtol(),除非有特殊需求(如嵌入式环境或教学目的)。

c语言16进制转10进制 函数
(图片来源网络,侵删)
-- 展开阅读全文 --
头像
return在C语言中具体如何使用?
« 上一篇 01-09
苏小红C语言PDF哪里能找到免费资源?
下一篇 » 01-09
取消
微信二维码
支付宝二维码

目录[+]