在C中将十六进制转换为十进制错误

时间:2019-10-05 04:52:27

标签: c

int htoi(char s[]) {
  int c;
  int sum = 0;
  int counter = 0;
  for (int i = sizeof(s)/sizeof(s[0]) - 2; (c = tolower(s[i])) >= 'a' && (c = tolower(s[i]) <= 'f'); i--) {
    int temp = (int) pow(16, counter) * (c - 87);
    sum += temp;
    counter++;
  }
  return sum;
}

我用以下方法调用该方法

int main()
{
  char s[] = "FFF";
  printf("%d\n", htoi(s));
}

我刚刚开始学习C。我正在尝试创建一种将十六进制转换为十进制的方法,但是以下代码不起作用。它在我的终端上输出-87,我不确定为什么。

编辑:刚刚意识到我的代码没有考虑实际数字,但是当我输入“ FFF”作为输入数组时,这两种方式都不起作用。

1 个答案:

答案 0 :(得分:2)

代码有麻烦:

它错误地使用sizeof(s)来查找“数组” char s[]的大小,但是s是一个指针。调用代码的s是一个数组,但是当用作函数参数时,它会转换为第一个元素(指针)的地址。特别是,char s[]是用作函数参数的指针。

它将c分配给比较c = tolower(s[i]) <= 'f'的结果,而不是小写的值。 @MikeCAT

它不处理'0' - '9'

相反,只需简单地遍历s所指向的字符串,从第一个(最高有效数字)到最后一个(最低)。

int htoi(const char *s) {
  int sum = 0;
  while (isxdigit((unsigned char) *s)) {
    int digit_value;
    int char_value = (unsigned char) *s++;  // Get unsigned value and advance s
    if (isdigit(char_value)) {
      digit_value = *s - '0'; 
    } else {
      digit_value = tolower(char_value) - 'a' + 10; 
    }
    sum = sum * 16 + digit_value;
  }
  return sum;
}

很少有代码需要一个 signed 十六进制值。考虑返回unsigned类型。

unsigned htou(const char *s) { 
  unsigned  sum = 0;
  ...