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

这篇文章主要为大家详细介绍了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

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值