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

(图片来源网络,侵删)
方法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:手动实现转换函数
如果不依赖标准库,可以手动编写转换函数,以下是实现逻辑:
- 遍历字符串的每个字符。
- 将字符转换为对应的数值(如 'A' → 10, 'F' → 15)。
- 按位权累加计算十进制值。
示例代码:
#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
关键点说明
-
strtol()的优势:- 直接使用标准库,代码简洁高效。
- 能检测非法字符(通过
endptr参数)。 - 支持任意进制(如2、8、10、16等)。
-
手动实现的注意事项:
(图片来源网络,侵删)- 需要处理大小写(如 'a' 和 'A' 均视为10)。
- 需要跳过前缀(如 "0x")。
- 非法字符的处理需明确(如返回错误码或终止转换)。
-
边界情况:
- 空字符串或
NULL指针。 - 超出
long范围的值(strtol会设置errno)。
- 空字符串或
扩展:无符号整数转换
如果需要转换为无符号整数(unsigned long),可以使用 strtoul():
unsigned long value = strtoul(hexStr, NULL, 16);

(图片来源网络,侵删)
