C语言十六进制转十进制的三种实现方案
在C语言开发中,将十六进制字符串安全、准确地转换为十进制整数是常见的需求。本文通过三个递进的代码案例,展示如何从零实现转换逻辑,并解决非法字符截断、前缀识别及符号处理等关键问题。
基础算法:按位权值累加
核心思想是将字符串视为多项式,利用 'a'-'A'+10 进行字符映射,通过循环累加实现转换。以下是针对无无效字符场景的基础实现:
#include<stdio.h>
#include<string.h>
void conversion(char str[]){
int i=0,j=0,num=0,sum=0;
int len=strlen(str);
while(str[i]!='\0')
{
// 判断字符类型并转为数值
if(str[i]>='0'&&str[i]<='9')
num=str[i]-'0';
else if(str[i]>='a'&&str[i]<='f')
num=str[i]-'a'+10;
else if(str[i]>='A'&&str[i]<='F')
num=str[i]-'A'+10;
else
break; // 遇到非16进制字符停止
// 执行权值计算:当前位 * 16^(剩余长度)
for(j=0;j
优化方案:增强输入健壮性
上述代码若遇到如 5r123 这样的混合字符串,可能因长度计数滞后导致结果偏差(如输出80而非5)。优化策略是在主循环前预扫描有效长度,或在遍历中动态调整权重:
#include<stdio.h>
#include<string.h>
void conversion_robust(char str[])
{
int i = 0, j=0, num = 0, sum = 0, valid_len = 0;
// 第一步:预扫描确定实际合法的十六进制位数
while ((str[i] >= 'a' && str[i] <= 'f') || (str[i] >= 'A' && str[i] <= 'F') || (str[i] >= '0' && str[i] <= '9'))
{
valid_len++;
i++;
}
i = 0; // 重置指针开始正式计算
while (str[i] != '\0')
{
if (str[i] >= '0' && str[i] <= '9')
num = str[i] - '0';
else if (str[i] >= 'a' && str[i] <= 'f')
num = str[i] - 'a' + 10;
else if (str[i] >= 'A' && str[i] <= 'F')
num = str[i] - 'A' + 10;
else
break; // 遇到非十六进制字符立即终止
// 权值累乘
for (j = 0; j < valid_len - 1; j++)
num = num * 16;
sum += num;
i++;
valid_len--;
}
printf("%d\n", sum);
}
高级实现:符合标准的转换函数
在实际项目中,常需兼容空格、正负号及常见的 0x 前缀。该方案结合了 ctype.h 标准库函数,逻辑更严密:

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
int Get_0x(const char *str)
{
int sum = 0;
int index = 1;
// 1. 跳过前置空白字符
while(isspace(*str)) str++;
// 2. 处理正负号
if(*str=='-')
{
index *= -1;
str++;
}
else if(*str=='+')
{
str++;
}
// 3. 跳过 0x 或 0X 前缀
if((*str=='0') && (*(str+1)=='x'|| *(str+1)=='X'))
{
str+=2;
}
// 4. 核心转换逻辑
while(isxdigit(*str))
{
if(isdigit(*str))
sum = sum*16 + (*str-'0');
else if(islower(*str))
sum = sum*16 + (*str-'a'+10);
else
sum = sum*16 + (*str-'A'+10);
str++;
}
// 验证是否遇到结束符,防止中间截断的歧义
return (*str == '\0') ? sum * index : INT_MAX;
}
int main(){
// 测试用例含前缀、空格、符号
printf("%d\n", Get_0x("0x123ABc"));
printf("%d\n", Get_0x("-0x123"));
return 0;
}
以上就是C语言实现十六进制转十进制的详细内容,更多关于C语言进制转换与字符串处理技巧的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













