题目描述
补充知识
优化算法
补充办法
题目描述输入一个十六进制数字串,将其转换成为对应的整数并输出转换结果,遇到非十六进制数字或字符串结束符('\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语言十六进制转十进制内容请搜索软件开发网以前的文章或继续浏览下面的相关文章希望大家以后多多支持软件开发网!