这篇文章主要为大家详细介绍了C语言实现十六进制转换为十进制的方法,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
题目描述
输入一个十六进制数字串,将其转换成为对应的整数并输出转换结果,遇到非十六进制数字或字符串结束符('\0')结束转换。
注意: 输入的字符串的长度不会超过100;转换后的值不会超出int类型的范围。
1.测试输入:55 //程序的输入不会有十六进制的前缀
预期输出:85
2.测试输入:f1r2 //程序的输入不会有十六进制的前缀
预期输出:241
补充知识
十六进制转换为十进制的做法:
![](https://img-blog.csdnimg.cn/img_convert/939e119ab5ad91d4a5b30bfd9a02c924.png)
算法分析
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; } |
调试结果
![](https://img-blog.csdnimg.cn/img_convert/eba31c6f4a3d2c8d742148fbf397079e.png)
到此这篇关于C语言实现十六进制转换为十进制的方法详解的文章就介绍到这了,希望对你有所帮助。
来源:https://www.weidianyuedu.com