C语言十六进制转十进制的三种实现方案

阿橙
阿橙
发布时间:2026-10-15 | 3人浏览过
原创

在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语言进制转换与字符串处理技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表