【问题标题】:Converting hexadecimal to decimal error in C在C中将十六进制转换为十进制错误
【发布时间】:2019-10-05 04:52:27
【问题描述】:
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”作为输入数组时,无论哪种方式都不起作用。

【问题讨论】:

  • sizeof(s) 这里是指针的大小——而不是数组的大小。你这样做是为了达到什么目的?
  • 我的目标是从数组的末尾迭代到开头。你能告诉我如何获得数组的大小吗?我认为数组几乎等同于 C 中的指针!
  • 数组不是指针——指针不是数组。将数组大小传递给函数。
  • 请发布Minimal, Complete, and Verifiable example,包括您调用htoi的代码。
  • 注意:(c = tolower(s[i]) &lt;= 'f') 也是错误的,它会根据比较结果将01 分配给c

标签: c


【解决方案1】:

代码有问题:

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

它将c 分配给比较结果c = tolower(s[i]) &lt;= '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;
}

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

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

【讨论】:

    猜你喜欢
    • 2017-07-31
    • 2013-07-20
    • 2012-06-17
    • 2021-06-26
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    相关资源
    最近更新 更多