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

(图片来源网络,侵删)
方法1:使用标准库函数 strtol()
strtol() 是一个强大的函数,可以将字符串转换为长整型(long),并支持多种进制(如16进制)。
函数原型:
long strtol(const char *str, char **endptr, int base);
str:要转换的字符串。endptr:用于存储转换后剩余部分的指针(可选,可设为NULL)。base:进制数(16表示16进制)。
示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char hexStr[] = "1A3F"; // 16进制字符串
long decimalValue;
// 使用strtol转换
decimalValue = strtol(hexStr, NULL, 16);
printf("16进制 %s 转换为10进制是: %ld\n", hexStr, decimalValue);
return 0;
}
输出:
16进制 1A3F 转换为10进制是: 6719
注意事项:
- 字符串必须以合法的16进制字符开头(如
0x前缀或数字0-9、字母A-F/a-f)。 - 如果转换失败,
strtol()会返回0,并设置errno为EINVAL(需检查errno)。 - 如果结果超出
long范围,行为未定义(需检查errno是否为ERANGE)。
方法2:手动编写转换函数
如果不想依赖strtol(),可以手动实现16进制到10进制的转换。
实现逻辑:
- 遍历字符串的每个字符。
- 将字符转换为对应的数值(如
'A'→10,'F'→15)。 - 累加结果:
result = result * 16 + current_digit。
示例代码:
#include <stdio.h>
#include <ctype.h> // 用于tolower()
int hexCharToInt(char c) {
c = tolower(c); // 统一转为小写
if (c >= '0' && c <= '9') return c - '0';
if (c >= 'a' && c <= 'f') return c - 'a' + 10;
return -1; // 非法字符
}
long hexToDecimal(const char *hexStr) {
long result = 0;
for (int i = 0; hexStr[i] != '\0'; i++) {
int digit = hexCharToInt(hexStr[i]);
if (digit == -1) {
printf("错误:非法字符 '%c'\n", hexStr[i]);
return -1; // 返回-1表示错误
}
result = result * 16 + digit;
}
return result;
}
int main() {
char hexStr[] = "1A3F";
long decimalValue = hexToDecimal(hexStr);
if (decimalValue != -1) {
printf("16进制 %s 转换为10进制是: %ld\n", hexStr, decimalValue);
}
return 0;
}
输出:

(图片来源网络,侵删)
16进制 1A3F 转换为10进制是: 6719
注意事项:
- 手动实现需要处理非法字符(如非16进制字符)。
- 如果输入字符串为空或全非法字符,应返回错误(如
-1)。 - 同样需要检查数值范围是否超出
long的限制。
方法3:使用 sscanf()(简单场景)
如果只是简单的转换且不需要错误处理,可以用sscanf():
#include <stdio.h>
int main() {
char hexStr[] = "1A3F";
long decimalValue;
sscanf(hexStr, "%lx", &decimalValue); // %lx表示16进制long
printf("16进制 %s 转换为10进制是: %ld\n", hexStr, decimalValue);
return 0;
}
输出:
16进制 1A3F 转换为10进制是: 6719
注意事项:
sscanf()不会报告错误,如果字符串非法,结果可能为0或未定义。
| 方法 | 优点 | 缺点 |
|---|---|---|
strtol() |
功能强大,支持错误检查 | 需要处理errno和endptr |
| 手动实现 | 完全可控,适合学习算法 | 需要自行处理错误和边界情况 |
sscanf() |
代码简单 | 无错误处理,不推荐生产环境使用 |
推荐使用strtol(),除非有特殊需求(如嵌入式环境或教学目的)。

(图片来源网络,侵删)
