所以,我写了一个函数,通过使用递归将十进制数转换为十六进制数,但我似乎无法弄清楚如何将前缀“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);
}
答案 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")
及其参数的存在,而是要了解如何(以及为什么)使用递归。