Dr丶温 发表于 2018-3-18 10:46:07

十六进制转十进制问题

为啥的出的结果比正确的结果少3呢,不求甚解
#include <stdio.h>
#include <math.h>
#include <string.h>

//输入十六进制数,转换成十进制

#define MAX 30

int hex(char array[]);        //进制转换

int main(void)
{
        char number;        //存放合法的十六进制数字
       
        printf("请输入一个十六进制数:");
        scanf("%s", number);       
                               
        printf("十六进制的 %s 转换成十进制为 %d \n", number, hex(number));
               
       
       
        getch();
        return 0;
}

int hex(char array)
{
        int i, j;                //循环变量
        int sum = 0;        //获取最终结果
        int len;                //获取该数组的长度
        inttemp;                //获取每个字符的转换成十进制后的值
       
        len = strlen(array);
       
        for(i = len, j = 0; i >= 0; i--, j++)
        {
                if(array <= '9')
                {
                        temp = array - '0';
                }
                else if(array >= 'A' && array <= 'Z')
                {
                        temp = array - 'A' + 10;
                }
                else if(array >= 'a' && array <= 'z')
                {
                        temp = array - 'a' + 10;
                }
               
               sum +=temp*(pow(16, j-1));
        }
       
        return sum;
}

t6am3 发表于 2018-3-18 10:46:08

嗯嗯知道了 ,你在第50行 pow函数的返回值是double型的 你在前面加一个(int)把他转化为int型就不会出错了
另外 主函数里的getch()应该是多余的
另外建议楼主输入十六进制数以0xff这样比较规范, 传字符数组的时候只要传向后两位的指针就可以了

ba21 发表于 2018-3-18 12:07:12

#include <stdio.h>
#include <math.h>
#include <string.h>

//输入十六进制数,转换成十进制

#define MAX 30

int hex(char array[]);      //进制转换

int main(void)
{
      char number;      //存放合法的十六进制数字
      
      printf("请输入一个十六进制数:");
      scanf("%s", number);      
                              
      printf("十六进制的 %s 转换成十进制为 %d \n", number, hex(number));
               
      
      
      getch();
      return 0;
}

int hex(char array)
{
      int i, j;                //循环变量
      int sum = 0;      //获取最终结果
      int len;                //获取该数组的长度
      inttemp;                //获取每个字符的转换成十进制后的值

      len = strlen(array);
      
      for(i = len-1, j=0; i >= 0; i--, j++)
      {
                if(array <= '9')
                {
                        temp = array - '0';

                }
                else if(array >= 'A' && array <= 'F')
                {
                        temp = array - 'A' + 10;

                }
                else if(array >= 'a' && array <= 'f')
                {
                        temp = array - 'a' + 10;

                }
               

               sum += temp*pow(16, j);
      }
      
      return sum;
}

BngThea 发表于 2018-3-18 12:10:55

j从0开始循环,第50行指数为什么是j-1

t6am3 发表于 2018-3-18 14:39:09

楼主输入什么 少3?

Dr丶温 发表于 2018-3-19 08:17:37

BngThea 发表于 2018-3-18 12:10
j从0开始循环,第50行指数为什么是j-1

俺这里不减的话会多乘一次,结果差距好大的。。{:10_266:}

人造人 发表于 2018-3-19 12:41:52

Dr丶温 发表于 2018-3-19 08:17
俺这里不减的话会多乘一次,结果差距好大的。。

#include <stdio.h>
#include <string.h>
#include <ctype.h>

//输入十六进制数,转换成十进制

#define MAX 30

int hex(char array[]);      //进制转换

int main(void)
{
        //char number;      //存放合法的十六进制数字

        //printf("请输入一个十六进制数:");
        //scanf("%s", number);


        char number = "9FFFF";
        printf("十六进制的 %s 转换成十进制为 %d \n", number, hex(number));



//        getch();
        return 0;
}

//int hex(char array)
//{
//        int i, j;                //循环变量
//        int sum = 0;      //获取最终结果
//        int len;                //获取该数组的长度
//        inttemp;                //获取每个字符的转换成十进制后的值
//
//        len = strlen(array);
//
//        for(i = len, j = 0; i >= 0; i--, j++)
//        {
//                if(array <= '9')
//                {
//                        temp = array - '0';
//                }
//                else if(array >= 'A' && array <= 'Z')
//                {
//                        temp = array - 'A' + 10;
//                }
//                else if(array >= 'a' && array <= 'z')
//                {
//                        temp = array - 'a' + 10;
//                }
//
//                sum += temp * (pow(16, j - 1));
//        }
//
//        return sum;
//}


int hex(char array)
{
        int len = strlen(array);
        int sum = 0;
        int temp;

        for(int i = 0; i < len; ++i)
        {
                if(isdigit(array))
                {
                        temp = array - '0';
                }
                else if(isupper(array))
                {
                        temp = array - 'A' + 10;
                }
                else
                {
                        temp = array - 'a' + 10;
                }

                sum = sum * 16 + temp;
        }

        return sum;
}

Dr丶温 发表于 2018-3-19 20:14:28

人造人 发表于 2018-3-19 12:41


真是多谢代码啦,不过感觉用自己脑洞的基础上再深入好些{:10_254:}

Dr丶温 发表于 2018-3-19 20:18:50

ba21 发表于 2018-3-18 12:07


还可以酱紫改!!!!!
长知识了,谢谢哈{:10_297:}

Dr丶温 发表于 2018-3-19 20:19:24

t6am3 发表于 2018-3-18 14:41
嗯嗯知道了 ,你在第50行 pow函数的返回值是double型的 你在前面加一个(int)把他转化为int型就不会出错了 ...

感谢答疑,懂了一半了。。。
页: [1]
查看完整版本: 十六进制转十进制问题