这篇文章主要为大家详细介绍了C语言实现十六进制转换为十进制的方法,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下

题目描述

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

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

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

预期输出:85

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

预期输出:241

补充知识

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

算法分析

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

#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,那么就会被计算为

优化算法

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

#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  **********/

}

补充办法

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

#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语言实现十六进制转换为十进制的方法详解的文章就介绍到这了,希望对你有所帮助。

来源:https://www.weidianyuedu.com

C语言实现十六进制转换为十进制的方法相关推荐

  1. 一种在程序中将十六进制转换为十进制的简单方法

    在网上找了很多将十六进制转换为十进制的方法,都比较复杂:后来自己想了一个比较简单的方法,跟大家分享一下! 以下是C++语言编写的代码: #include<iostream> using n ...

  2. c语言中将十六进制数转换为十进制数程序,C语言中十六进制转十进制两种实现方法...

    C语言中十六进制转十进制两种实现方法 C语言 · 十六进制转十进制 问题描述 从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出. 注:十六进制数中的10~15分别用大写的英 ...

  3. c语言栈10转16进制,用栈实现十六进制转换为十进制.doc

    用栈实现十六进制转换为十进制 数据结构上机报告 班 级信科2班学 号19姓 名李柏威 实验内容:利用栈的基本操作,写一个C程序实现将十进制数转化为十六进制数 实验目的:掌握栈的操作 提交内容: C语言 ...

  4. 将二进制、八进制、十六进制转换为十进制

    上节我们对二进制.八进制和十六进制进行了说明,本节重点讲解不同进制之间的转换,这在编程中经常会用到,尤其是C语言. 将二进制.八进制.十六进制转换为十进制 二进制.八进制和十六进制向十进制转换都非常容 ...

  5. 十六进制转换为十进制的效率问题

    十六进制转换为十进制这样说有点笼统,因为一般来说十六进制是字符串,十进制也可能是字符串或是整数.下面我们来看看. 1.十六进制字符串转换为十进制的字符串 #include<stdio.h> ...

  6. C语言中将数字转换为字符串的方法

    C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串.以下是用itoa()函数将整数转换为字符串的一个例子: # include <stdio. h> # ...

  7. C语言任何基数转换为十进制(附完整源码)

    C语言任何基数转换为十进制 C语言任何基数转换为十进制完整源码 C语言任何基数转换为十进制完整源码 #include <ctype.h> #include <stdio.h>i ...

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

    本文实例讲述了C语言实现直角坐标转换为极坐标的方法.分享给大家供大家参考,具体如下: #include #include struct complex_s{ double x,y; }; double ...

  9. 任意进制转换为十进制(十六进制转换为十进制)

    一.十六进制转换为十进制 unsigned long HextoDec(char *hex, int length) {int i;unsigned long rslt = 0;for (i = 0; ...

最新文章

  1. java生成sql语句_java生成SQL语句
  2. ISP PIPLINE (九_1) Denoise 之 space domain denoise
  3. oracle 分区表
  4. itext 添加空格_借助 iText 用代码在 PDF 中创建空白签名域
  5. u盘安装ubuntu_简单实用的ubuntu18.04安装
  6. Postman界面了解
  7. Nginx命令配置到系统环境
  8. 现代的时代精神是什么?
  9. 通信模块开发 c语言,I2C通信模块c语言库文件
  10. 微软符号服务器opencv的符号,Opencv Mat类详解和用法1
  11. ORACLE客户端连接
  12. jmx为啥开了额外两个随机端口?
  13. caffe/build/tools下会生成一些工具
  14. Extjs学习(3):事件和动作
  15. java事物 tran_Java基础——事务
  16. 面试官:如何理解TCP/IP协议?
  17. BaseFX 实习小记(一)
  18. 男友是程序员,看着他压力大我难受。有哪些缓解压力的好方法?
  19. 使用终端生成icns,icon文件
  20. 如何利用液体密度传感器准确地表征罐箱的质量规格?

热门文章

  1. C++我的世界2D版
  2. 可编程控制器的应用技术
  3. java ISO 8601 日期格式进行转换
  4. signature=a8a3e788013f73439051c7287d7f5f0b,广东省第三届强网杯Writeup
  5. php递归函数命令,PHP递归函数用法
  6. 菜鸟之路——机器学习之SVM分类器学习理解以及Python实现
  7. 每日一题之hiho213周 Boarding Passes
  8. Centos 7.3 安装Perl
  9. linux更mysql改密码_Linux下mysql密码的两种修改方式
  10. 基于猎人猎物优化算法的函数寻优算法