C语言实现十六进制转换为十进制的方法详解

 更新时间:2022年11月28日 15:52:38   作者:畅游星辰大海  
这篇文章主要为大家详细介绍了C语言实现十六进制转换为十进制的方法,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下

题目描述

输入一个十六进制数字串,将其转换成为对应的整数并输出转换结果,遇到非十六进制数字或字符串结束符('\0')结束转换。

注意: 输入的字符串的长度不会超过100;转换后的值不会超出int类型的范围。

1.测试输入:55 //程序的输入不会有十六进制的前缀

预期输出:85

2.测试输入:f1r2 //程序的输入不会有十六进制的前缀

预期输出:241

补充知识

十六进制转换为十进制的做法:

算法分析

#include<stdio.h>
#include<string.h>
void conversion(char str[]){
    /**********  Begin  **********/
    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;
        for(j=0;j<len-1;j++)
        {
            num=num*16;
        }
        sum+=num;   
        i++;
        len--;
    }
    printf("%d",sum);
    /**********  End  **********/
}

上面代码不够完善,当遇到一些特殊情况(当出现非16进制的字符的时候)就会出错,例如:

测试输入:5r //程序的输入不会有十六进制的前缀

预期输出:5

实际输出:80

问题在于:

我们使用字符的长度n(程序中以len代替)来决定 5*,r也被记录在内,导致多乘了一个16。

而且对循环的结束条件设置的不合理,如果输入的例子为5r123,那么就会被计算为

优化算法

#include<stdio.h>
#include<string.h>
void conversion(char str[]) 
{
    /**********  Begin  **********/
    int i = 0, j=0,num = 0, sum = 0,len=0;
    //int len = strlen(str);//这种方法会将非16进制数记录在内
    while ((str[i] >= 'a' && str[i] <= 'f') || (str[i] >= 'A' && str[i] <= 'F') || (str[i] >= '0' && str[i] <= '9'))
    {
        len++;
        i++;
    } //遍历数组记录16进制数的个数,非16进制数不计在内 
    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;//遇到'\0'之前的第一个非十六进制数就停止循环
        for (j = 0; j < len - 1; j++)
        {
            num = num * 16;
        }
        sum += num;
        i++;
        len--;//每读取一位就使长度-1
    }
    printf("%d\n", sum);
    /**********  End  **********/
}

补充办法

除了以上方法,小编为为大家整理了一些其他方法实现十六进制转十进制,需要的可以参考一下

#include<stdio.h>
#include<ctype.h>
int Get_0x(const char *str)
{
	int sum = 0;
	while(isspace(*str))
	{
		str++;
	}
	//此时 空格处理结束
	int index = 1;
	if(*str=='-' || *str=='+')
	{
		if(*str=='-')
		{
			index *= -1;
		}
		else
		{
			index = 1;
		}
		str++;
	}
	
	if((*str=='0') && (*(str+1)=='x'|| *(str+1)=='X'))
	{
		str+=2;
	}
	else
	{
		return INT_MAX;
	}
 
	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++;
	}
	if(*str == '\0')
		return sum * index;
	return INT_MAX;
}
int main()
{
	printf("%d\n", Get_0x("0x123ABcW"));
	printf("%d\n", Get_0x("0X123ABc"));
	printf("%d\n", Get_0x("      0x123ABc"));
	printf("%d\n", Get_0x("+0x123ABc"));
	printf("%d\n", Get_0x("-0x123ABc"));
	printf("%d\n", Get_0x("  +0x123ABc"));
	printf("%d\n", Get_0x("   -0x123ABc"));
    return 0;
}

调试结果

到此这篇关于C语言实现十六进制转换为十进制的方法详解的文章就介绍到这了,更多相关C语言十六进制转十进制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++虚函数和多态超详细分析

    C++虚函数和多态超详细分析

    这篇文章主要介绍了C++多态的特性派生与虚函数与模板,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-01-01
  • C++利用libcurl获取下载文件名称及大小

    C++利用libcurl获取下载文件名称及大小

    这篇文章主要为大家详细介绍了C++如何利用libcurl获取下载文件名称及大小的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-03-03
  • C++开发protobuf动态解析工具

    C++开发protobuf动态解析工具

    这篇文章主要为大家介绍了C++开发protobuf动态解析工具实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • C语言实现linux网卡连接检测的方法

    C语言实现linux网卡连接检测的方法

    这篇文章主要为大家详细介绍了C语言实现linux网卡连接检测的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • C++11 强类型枚举相关总结

    C++11 强类型枚举相关总结

    这篇文章主要介绍了C++11 强类型枚举的相关资料,帮助大家更好的理解和学习使用c++11,感兴趣的朋友可以了解下
    2021-02-02
  • c++大数阶乘的实现方法

    c++大数阶乘的实现方法

    本篇文章对c++的大数阶乘进行了代码示例的介绍。需要的朋友参考下
    2013-05-05
  • C语言实现单链表反转

    C语言实现单链表反转

    这篇文章主要介绍了C语言实现单链表反转,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • C++智能指针模板应用详细介绍

    C++智能指针模板应用详细介绍

    从比较简单的层面来看,智能指针是RAII(Resource Acquisition Is Initialization,资源获取即初始化)机制对普通指针进行的一层封装。这样使得智能指针的行为动作像一个指针,本质上却是一个对象,这样可以方便管理一个对象的生命周期
    2022-08-08
  • C++中map 字典的基本使用教程

    C++中map 字典的基本使用教程

    Map是字典一样的数据结构,它是(键,值)对的关联数组,其中每个唯一键仅与单个值相关联,下面这篇文章主要给大家介绍了关于C++中map 字典的基本使用的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-09-09
  • C++实现通讯录小功能

    C++实现通讯录小功能

    这篇文章主要为大家详细介绍了C++实现通讯录小功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06

最新评论