C语言十六进制转十进制函数如何实现?

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

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

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

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

strtol() 函数可以将字符串转换为长整型(long),并支持指定基数(如16表示十六进制)。

函数原型:

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

示例代码:

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

输出:

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

方法2:手动实现转换函数

如果不依赖标准库,可以手动编写转换函数,以下是实现逻辑:

  1. 遍历字符串的每个字符。
  2. 将字符转换为对应的数值(如 'A' → 10, 'F' → 15)。
  3. 按位权累加计算十进制值。

示例代码:

#include <stdio.h>
#include <ctype.h> // 用于字符处理函数
int hexToDecimal(const char *hexStr) {
    int decimal = 0;
    int i = 0;
    // 跳过可能的 "0x" 或 "0X" 前缀
    if (hexStr[0] == '0' && (hexStr[1] == 'x' || hexStr[1] == 'X')) {
        i = 2;
    }
    while (hexStr[i] != '\0') {
        char c = toupper(hexStr[i]); // 统一转为大写
        int digit;
        if (c >= '0' && c <= '9') {
            digit = c - '0';
        } else if (c >= 'A' && c <= 'F') {
            digit = 10 + (c - 'A');
        } else {
            // 非法字符,直接返回当前结果或报错
            printf("非法的十六进制字符: %c\n", c);
            return -1;
        }
        decimal = decimal * 16 + digit;
        i++;
    }
    return decimal;
}
int main() {
    const char *hexStr = "1A3F";
    int decimalValue = hexToDecimal(hexStr);
    if (decimalValue != -1) {
        printf("十六进制 %s 转换为十进制是: %d\n", hexStr, decimalValue);
    }
    return 0;
}

输出:

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

关键点说明

  1. strtol() 的优势

    • 直接使用标准库,代码简洁高效。
    • 能检测非法字符(通过 endptr 参数)。
    • 支持任意进制(如2、8、10、16等)。
  2. 手动实现的注意事项

    c语言十六进制转十进制函数
    (图片来源网络,侵删)
    • 需要处理大小写(如 'a' 和 'A' 均视为10)。
    • 需要跳过前缀(如 "0x")。
    • 非法字符的处理需明确(如返回错误码或终止转换)。
  3. 边界情况

    • 空字符串或 NULL 指针。
    • 超出 long 范围的值(strtol 会设置 errno)。

扩展:无符号整数转换

如果需要转换为无符号整数(unsigned long),可以使用 strtoul()

unsigned long value = strtoul(hexStr, NULL, 16);
c语言十六进制转十进制函数
(图片来源网络,侵删)
-- 展开阅读全文 --
头像
耿国华数据结构(C语言版)答案哪里找?
« 上一篇 今天
为何C语言程序的基本单位是函数?
下一篇 » 今天

相关文章

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

目录[+]