如何使我的十六进制吐出8位数(包括前导零)

时间:2013-10-08 07:31:00

标签: c recursion decimal hex

所以,我写了一个函数,通过使用递归将十进制数转换为十六进制数,但我似乎无法弄清楚如何将前缀“0x”和前导零添加到我转换后的十六进制数。假设我将数字18传递给函数的参数。等效的十六进制数应为0x00000012。但是,我最终只得到12作为我的十六进制数。传递十六进制数0xFEEDDAD时同样适用。我最终得到的FEEDDAD没有前缀作为我的答案。有人可以帮我解决这个问题吗?我在下面列出了我的代码。另外,我只允许使用fputc来显示我的输出。

const char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

void hexout (unsigned long number, FILE * stream) 
{
     long quotient;
     long remainder;

     quotient = number / 16;
     remainder = number % 16;


     if(quotient != 0)
       hexout(quotient,stream);


     fputc(digits[remainder],stream);
}

3 个答案:

答案 0 :(得分:1)

void hexout (unsigned long number, FILE * stream) 
{
    fprintf(stream, "0x%08lX", number);
}

如果你不能使用fprintf(既不是sprintf),你可以使用这种代码(没有递归,但堆栈上有8个字符的数组):

const char digits[] = "0123456789ABCDEF";

void hexout(unsigned long number, FILE * stream)
{
  unsigned long int input = number;
  unsigned long int quotient;
  unsigned long int remainder;
  unsigned short ndigit = 0;
  char result[8] = {0};

  // Compute digits
  do
  {
     quotient  = input / 16;
     remainder = input % 16;
     result[7-ndigit] = digits[remainder];
     input = quotient;
     ndigit++;
  }
  while (ndigit < 8);

  // Display result

  fputc('0', stream);
  fputc('x', stream);
  for (ndigit = 0; ndigit < 8; ndigit++)
  {
    fputc(result[ndigit], stream);
  }
}

当然,这可以改善很多......

答案 1 :(得分:0)

向字符串添加数字,并使用fprintf打印带零填充的字符串。或者只使用fprintf开头。

答案 2 :(得分:0)

由于显而易见的原因,您自己的hexout失败了。当值达到0时,您无法“继续”输出多个零,因为您不知道已经发出了多少个数字。此外,你不知道何时在你开始发出十六进制数字之前加上“0x” - ,但你怎么知道你刚开始呢?

执行此操作的逻辑方法是不使用递归,而是使用简单的循环。然后再说 - 没有说,但公平地认为这是一个家庭作业,在这种情况下,任何数量的愚蠢约束都是可能的(“写一个C程序而不使用字符'{'”)。在你的情况下,它是“你必须使用递归”。

必须为你的递归函数添加一个计数器;当它达到0时,你知道你有输出0x,如果它不是0,你需要输出一个十六进制数字,无论如果你的值是0。有几种方法可以为递归函数添加一个计数器:一个全局变量(这将是最简单的完全最丑的方式,所以请不要在这里停止阅读),{{1变量 - 仅在语义上优于全局 - 或传递引用参数(其中某些表示是myth,但最终结果是相同)。

哪种方法最适合您,取决于您使用该方法保护 的原因。

¹static是一个“不合逻辑”的解决方案吗?是。它解决了这个问题,但没有任何进一步的见解。这个赋值的目的不是要找出printf("0x%08X")及其参数的存在,而是要了解如何(以及为什么)使用递归。