不用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^0a[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';
     
程序:
#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);
   }
    
}