C语言实现十六进制转换为十进制的方法详解
畅游星辰大海 人气:0题目描述
输入一个十六进制数字串,将其转换成为对应的整数并输出转换结果,遇到非十六进制数字或字符串结束符('\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; }
调试结果
加载全部内容