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

(图片来源网络,侵删)
方法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;
}
说明:
-
参数:
hexStr:待转换的16进制字符串。&endptr:指向一个字符指针,用于存储转换结束后的位置,如果字符串完全转换成功,endptr会指向字符串的末尾。16:表示输入字符串是16进制。
-
错误处理:
errno == ERANGE:转换后的值超出long的范围。endptr == hexStr:字符串未包含任何有效的数字。
方法2:使用 sscanf 函数
sscanf可以从字符串中按指定格式读取数据,适合简单的转换需求。

(图片来源网络,侵删)
示例代码:
#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;
}
说明:
-
格式说明符:
%x:表示读取16进制数(不区分大小写,%X也可用)。%u:表示输出为无符号整数。
-
返回值:
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;
}
说明:
hexCharToInt:将单个16进制字符(如'A'、'9')转换为对应的数值。hexToDecimal:遍历字符串,逐位计算10进制值。
| 方法 | 优点 | 缺点 |
|---|---|---|
strtol |
功能强大,支持错误检测 | 需要处理errno和endptr |
sscanf |
简单易用 | 错误处理较弱 |
| 手动实现 | 不依赖库函数,适合学习 | 代码较长,需自行处理边界情况 |
推荐使用 strtol 或 sscanf,除非有特殊需求(如嵌入式环境限制库函数)。
