方法1:使用标准库函数 strtol
strtol 函数可以将字符串形式的十六进制数转换为长整型(long)十进制数。

(图片来源网络,侵删)
示例代码
#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:手动实现转换
如果不使用标准库函数,可以手动实现十六进制到十进制的转换。
算法
- 遍历十六进制字符串的每个字符。
- 计算每个字符对应的十进制值(
'0'-'9'对应0-9,'A'-'F'或'a'-'f'对应10-15)。 - 累加结果:
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,因为它最健壮且功能全面。

(图片来源网络,侵删)
