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语言十六进制转十进制内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言中十六进制转十进制两种实现方法

    C语言 · 十六进制转十进制 问题描述 从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出. 注:十六进制数中的10~15分别用大写的英文字母A.B.C.D.E.F表示. 样例输入 FFFF 样例输出 65535 思路:感觉自己的下面两个方法都对,但是···不说了[狡诈]... 方案一: #include<stdio.h> #include<math.h> #include<string.h> int main(){ char s[50]; s

  • c语言中十六进制转二进制显示的实现方法

    复制代码 代码如下: //====================================== //输出格式: hex2bin 5e. //得到: 0101 1110 //====================================== #include <stdio.h>#include <limits.h> char *bitstr(char *, void const *, size_t); int main(int argc, char **argv){

  • C语言实现十六进制与二进制的相互转换

    目录 十六进制->二进制 二进制->十六进制 本文中的代码可以将文件中的十六进制存储与二进制存储相互转换. 十六进制->二进制 原理是:每两位存储为一个字符(char)保存. 因为十六进制数最大为 f,即 15,在内存中只需要 4 位就可以表示.而一般情况下一个字符是占一个字节 8 位,所以正好可以存储十六进制两位. 举个栗子: 在文件中存储十六进制为ab,ab转换为二进制,就是1010 1011,刚好八位,可以联想到ASCII码,用一个字符可以表示. 注意转为二进制后,前32个为不可见

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

    目录 题目描述 补充知识 优化算法 补充办法 题目描述 输入一个十六进制数字串,将其转换成为对应的整数并输出转换结果,遇到非十六进制数字或字符串结束符('\0')结束转换. 注意: 输入的字符串的长度不会超过100:转换后的值不会超出int类型的范围. 1.测试输入:55 //程序的输入不会有十六进制的前缀 预期输出:85 2.测试输入:f1r2 //程序的输入不会有十六进制的前缀 预期输出:241 补充知识 十六进制转换为十进制的做法: 算法分析 #include<stdio.h> #inc

  • java 三种将list转换为map的方法详解

    java 三种将list转换为map的方法详解 在本文中,介绍三种将list转换为map的方法: 1) 传统方法 假设有某个类如下 class Movie { private Integer rank; private String description; public Movie(Integer rank, String description) { super(); this.rank = rank; this.description = description; } public Int

  • C语言MFC导出dll回调函数方法详解

    目录 如何将回调函数导出来 dll内部回调函数功能讲解 1:定义开始定时操作函数 2:回调函数 2.1:定义回调函数接口 2.2:dll中使用回调函数触发消息 应用程序调用dll回调函数 1:加载dll库 2:声明回调函数 3:注册回调函数 如何将回调函数导出来 这一章节主要讲述在导出函数的基础上如何将回调函数导出来. 回调函数的应用相信很多C++程序猿儿们都不陌生吧,在某些场景下可谓是神助攻!那么,今天就来为大家讲解下,在导出dll中如何使用回调函数. 对于导出dll使用回调函数,大家不必惧怕

  • Go语言JSON解析器gjson使用方法详解

    目录 gjson 安装 使用 gjson GJSON 是一个Go包,它提供了一种从json文档中获取值的快速简单的方法.它具有单行检索.点符号路径.迭代和解析 json 行等功能. 还可以查看SJSON以修改 json,以及JJ命令行工具. 本自述文件是如何使用 GJSON 的快速概述,有关更多信息,请查看GJSON 语法. github 的地址在这里. 安装 安装gjson,使用的是go传统的安装方法: go install github.com/tidwall/gjson@latest 在文

  • Go语言中多字节字符的处理方法详解

    1 概述 Go语言的字符串是使用 UTF-8 编码的.UTF-8 是 Unicode 的实现方式之一.本文内容包括:UTF-8 和 Unicode 的关系,Go语言提供的 unicode 包和 unicode/utf8 包的使用. 下面话不多说了,来一起看看详细的介绍吧 2 UTF-8 和 Unicode 的关系 Unicode一种字符集,是国际标谁化组织(ISO)设计的一个包括了地球上所有文化.所有字母和符号 的编码.他们叫它 Universal Multiple-Octet Coded Ch

  • 解决C++ 无法从void 转换为LRESULT的方法详解

    这个应该是一个MFC程序,ON_MESSAGE是添加消息响应函数,这句话就是添加热键WM_HOTKEY的响应函数.当你注册了热键之后,当用户按下热键,会执行OnHotKey函数来处理这个消息.错误就应该是OnHotKey这个函数的声明错误了,返回值应该是LRESULT. VS2008对消息的检查更为严格,以前在VC6下完全正常运行的消息映射在VS2008下编译不通过 ON_MESSAGE(WM_message,OnMyMessage);OnMessage返回值必须为LRESULT,其形式为:af

  • C语言实现直角坐标转换为极坐标的方法

    本文实例讲述了C语言实现直角坐标转换为极坐标的方法.分享给大家供大家参考,具体如下: #include<stdio.h> #include<math.h> struct complex_s{ double x,y; }; double real_part(struct complex_s z){ return z.x; } double img_part(struct complex_s z){ return z.y; } double magnitude(struct compl

  • C语言memset函数使用方法详解

    C语言memset函数使用方法详解 一.函数原形   void *  memset(void*s, int ch,size_t n) 二.函数作用  将以s内存地址为首的连续n个字节的内容置成ch,一般用来对大量结构体和数组进行清零 三.常见错误 1.搞反了 ch 和 n的位置 对char[20]清零,一定是 memset(a,0,20); 2.过度使用memset 3.其实这个错误严格来讲不能算用错memset,但是它经常在使用memset的场合出现 int fun(strucy someth

  • 把JSON数据格式转换为Python的类对象方法详解(两种方法)

    JOSN字符串转换为自定义类实例对象 有时候我们有这种需求就是把一个JSON字符串转换为一个具体的Python类的实例,比如你接收到这样一个JSON字符串如下: {"Name": "Tom", "Sex": "Male", "BloodType": "A", "Hobbies": ["篮球", "足球"]} 我需要把这个转换为具

  • C语言system函数使用方法详解

    目录 函数接口 作用 返回值 测试代码 参数 MODE命令 color命令 函数接口 _DCRTIMP int __cdecl system( _In_opt_z_ char const* _Command ); system函数已经被收录在标准c库中,头文件为<stdlib.h> 作用 执行系统命令调用命令处理器来执行命令. 如果命令是空指针,则该函数只检查是否有命令处理器可以被此函数使用. 命令非空则调用命令的效果取决于系统和库的实现,并可能导致程序以非标准的方式运行或终止. 补充: 执行

随机推荐