C语言十六进制转十进制怎么实现?

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

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

strtol 函数可以将字符串形式的十六进制数转换为长整型(long)十进制数。

c语言十六进制转化为十进制
(图片来源网络,侵删)

示例代码

#include <stdio.h>
#include <stdlib.h>  // 包含 strtol 函数
#include <string.h>  // 包含 strlen 函数
int main() {
    const char *hexStr = "1A3F";  // 十六进制字符串
    char *endPtr;                 // 用于检测转换是否成功
    // strtol 的第三个参数 16 表示输入是十六进制
    long decimalNum = strtol(hexStr, &endPtr, 16);
    // 检查转换是否成功(endPtr 是否指向字符串末尾)
    if (endPtr == hexStr + strlen(hexStr)) {
        printf("十六进制 %s 转换为十进制: %ld\n", hexStr, decimalNum);
    } else {
        printf("转换失败:输入不是有效的十六进制数!\n");
    }
    return 0;
}

输出

十六进制 1A3F 转换为十进制: 6719

说明

  • strtol 会跳过前导空格,并处理 / 符号。
  • 如果输入无效(如包含非十六进制字符),endPtr 不会指向字符串末尾,可以据此判断转换是否成功。

方法2:手动实现转换

如果不使用标准库函数,可以手动实现十六进制到十进制的转换。

算法

  1. 遍历十六进制字符串的每个字符。
  2. 计算每个字符对应的十进制值('0'-'9' 对应 0-9'A'-'F''a'-'f' 对应 10-15)。
  3. 累加结果:result = result * 16 + 当前字符的十进制值

示例代码

#include <stdio.h>
#include <ctype.h>  // 用于 toupper 函数
int hexCharToDecimal(char c) {
    c = toupper(c);  // 统一转为大写
    if (c >= '0' && c <= '9') {
        return c - '0';
    } else if (c >= 'A' && c <= 'F') {
        return 10 + (c - 'A');
    } else {
        return -1;  // 无效字符
    }
}
long hexToDecimal(const char *hexStr) {
    long decimal = 0;
    for (int i = 0; hexStr[i] != '\0'; i++) {
        int digit = hexCharToDecimal(hexStr[i]);
        if (digit == -1) {
            printf("错误:字符 '%c' 不是有效的十六进制数字!\n", hexStr[i]);
            return -1;  // 转换失败
        }
        decimal = decimal * 16 + digit;
    }
    return decimal;
}
int main() {
    const char *hexStr = "1a3f";  // 可以是小写或大写
    long decimalNum = hexToDecimal(hexStr);
    if (decimalNum != -1) {
        printf("十六进制 %s 转换为十进制: %ld\n", hexStr, decimalNum);
    }
    return 0;
}

输出

十六进制 1a3f 转换为十进制: 6719

方法3:使用 sscanf(适用于格式化输入)

如果输入是固定格式的字符串(如 "0x1A3F"),可以用 sscanf 直接解析。

示例代码

#include <stdio.h>
int main() {
    const char *hexStr = "0x1A3F";  // 带前缀 "0x"
    unsigned long decimalNum;
    // %lx 表示读取无符号长整型十六进制数
    if (sscanf(hexStr, "%lx", &decimalNum) == 1) {
        printf("十六进制 %s 转换为十进制: %lu\n", hexStr, decimalNum);
    } else {
        printf("转换失败!\n");
    }
    return 0;
}

输出

十六进制 0x1A3F 转换为十进制: 6719

方法 适用场景 优点 缺点
strtol 通用字符串转换 自动处理前缀和错误检查 需要额外检查 endPtr
手动实现 学习或无库环境 灵活可控 需要处理边界情况
sscanf 带前缀(如 "0x1A")的输入 代码简洁 不适合复杂字符串解析

选择哪种方法取决于具体需求,推荐优先使用 strtol,因为它最健壮且功能全面。

c语言十六进制转化为十进制
(图片来源网络,侵删)
-- 展开阅读全文 --
头像
织梦移动端不更新,如何解决?
« 上一篇 03-06
dede忘记用户名密码怎么办?
下一篇 » 03-06

相关文章

取消
微信二维码
支付宝二维码

目录[+]