不用scanf("%i",a),试着粗暴整了整……
思路:
(1)2^31 准备8个十六进制的位置就够了。初始化符号数组,填充‘/0’。初始化整数数组,填充0。
(2)例如,读取 2 C 3 D \n \0 \0 \0,倒序后为 \0 \0 \0 \n D 3 C 2,挑选 非\0 非\n 的有效字符,结果为 D 3 C 2 \0 \0 \0 \0,记作字符数组 a。
这样,转换十进制,就可以用,sum = a[0]*16^0 + a[1]*16^1 + a[2]*16^2 + … + a[8]*16^8
(3)但是,在此之前,要把字数数组 a 中的字符,转换为十六进制对应的 数字,存储到整数数组 d 中。
字数数组 a 中的字符有4类:
a[i]>='a'&&a[i]<='f' d[i]=a[i]-'a'+10
a[i]>='A'&&a[i]<='F' d[i]=a[i]-'A'+10
a[i]>='0'&&a[i]<="9" d[i]=a[i]-'0'
最后的情况:a[i]=='\0' d[i]=a[i]-'\0';
a[i]>='A'&&a[i]<='F' d[i]=a[i]-'A'+10
a[i]>='0'&&a[i]<="9" d[i]=a[i]-'0'
最后的情况:a[i]=='\0' d[i]=a[i]-'\0';
程序:
#include <stdio.h>
#include <string.h>int main ()
{
char aa[8]={'\0'},b[2]={'\0'},a[8]={'\0'},bb[8]={'\0'};//2^31 准备8个十六进制的位置就够了
int d[8]={0};
while (scanf("%2c",b)>0)
{
scanf("%8c",aa);
int i,j=-1,sum=0;
//倒序
for (i=0;i<8;i++)
{
bb[j+8]=aa[i];
j--;
}
//挑选有效字符
j=0;
for (i=0;i<8;i++)
{
if ((bb[i]!='\0')&&(bb[i]!='\n'))
{
a[j]=bb[i];
j++;
}
}
//计算
float ji=1/16.0;//别忘了是浮点型
for (i=0;i<8;i++)
{
if (a[i]>='a'&&a[i]<='f')
d[i]=a[i]-'a'+10;
else if (a[i]>='A'&&a[i]<='F')
d[i]=a[i]-'A'+10;
else if (a[i]>='0'&&a[i]<="9")
d[i]=a[i]-'0';
else
d[i]=a[i]-'\0';
ji=ji*16;
sum=sum+d[i]*ji;
}
printf("%d",sum);
}
}