C语言16进制转10进制如何实现?

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

在C语言中,将16进制(Hexadecimal)字符串转换为10进制(Decimal)整数,可以通过标准库函数strtolsscanf实现,以下是两种常见的方法:

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

方法1:使用 strtol 函数(推荐)

strtol(string to long)可以将字符串转换为长整型,并支持指定进制(如16进制)。

示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h> // 用于错误处理
int main() {
    const char *hexStr = "1A3F"; // 16进制字符串
    char *endptr; // 用于检测转换是否完全成功
    long decimalValue;
    // 将16进制字符串转换为10进制长整型
    decimalValue = strtol(hexStr, &endptr, 16);
    // 检查转换是否成功
    if (errno == ERANGE) {
        printf("转换后的值超出long的范围!\n");
    } else if (endptr == hexStr) {
        printf("无效的16进制字符串!\n");
    } else {
        printf("16进制 %s 转换为10进制是: %ld\n", hexStr, decimalValue);
    }
    return 0;
}

说明:

  1. 参数

    • hexStr:待转换的16进制字符串。
    • &endptr:指向一个字符指针,用于存储转换结束后的位置,如果字符串完全转换成功,endptr会指向字符串的末尾。
    • 16:表示输入字符串是16进制。
  2. 错误处理

    • errno == ERANGE:转换后的值超出long的范围。
    • endptr == hexStr:字符串未包含任何有效的数字。

方法2:使用 sscanf 函数

sscanf可以从字符串中按指定格式读取数据,适合简单的转换需求。

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

示例代码:

#include <stdio.h>
int main() {
    const char *hexStr = "1A3F"; // 16进制字符串
    unsigned int decimalValue;
    // 从字符串中读取16进制数并转换为10进制
    if (sscanf(hexStr, "%x", &decimalValue) == 1) {
        printf("16进制 %s 转换为10进制是: %u\n", hexStr, decimalValue);
    } else {
        printf("无效的16进制字符串!\n");
    }
    return 0;
}

说明:

  1. 格式说明符

    • %x:表示读取16进制数(不区分大小写,%X也可用)。
    • %u:表示输出为无符号整数。
  2. 返回值

    • sscanf返回成功匹配的项数,如果返回1,表示转换成功。

方法3:手动实现(不依赖库函数)

如果需要手动实现转换逻辑,可以遍历字符串的每个字符,根据16进制权值计算10进制值。

示例代码:

#include <stdio.h>
#include <ctype.h> // 用于字符处理
int hexCharToInt(char c) {
    c = toupper(c); // 统一转为大写
    if (c >= '0' && c <= '9') return c - '0';
    if (c >= 'A' && c <= 'F') return 10 + (c - 'A');
    return -1; // 无效字符
}
long hexToDecimal(const char *hexStr) {
    long decimalValue = 0;
    for (int i = 0; hexStr[i] != '\0'; i++) {
        int digit = hexCharToInt(hexStr[i]);
        if (digit == -1) return -1; // 无效字符
        decimalValue = decimalValue * 16 + digit;
    }
    return decimalValue;
}
int main() {
    const char *hexStr = "1A3F";
    long decimalValue = hexToDecimal(hexStr);
    if (decimalValue == -1) {
        printf("无效的16进制字符串!\n");
    } else {
        printf("16进制 %s 转换为10进制是: %ld\n", hexStr, decimalValue);
    }
    return 0;
}

说明:

  1. hexCharToInt:将单个16进制字符(如 'A''9')转换为对应的数值。
  2. hexToDecimal:遍历字符串,逐位计算10进制值。

方法 优点 缺点
strtol 功能强大,支持错误检测 需要处理errnoendptr
sscanf 简单易用 错误处理较弱
手动实现 不依赖库函数,适合学习 代码较长,需自行处理边界情况

推荐使用 strtolsscanf,除非有特殊需求(如嵌入式环境限制库函数)。

-- 展开阅读全文 --
头像
dede 伪静态目录如何配置?
« 上一篇 03-23
c 语言 volatile
下一篇 » 03-23
取消
微信二维码
支付宝二维码

目录[+]