-6

需要将 char 的代码转换为八进制。也许先将 char 转换为十进制,然后再转换为八进制,如果它会更容易的话。没关系。

char c; // equal 'd' or '\n' for example
int d=...;//something to change

printf("%o",c)将是很好的变体,但我不能使用标准 C 函数。只有自己的转换实现。请在这里写一些更好的工具或您自己的工具。

printf() 如何为 (%o)

printf(ul, 8)
{
    /* hold a long in base 8 */
    char *p, buf[(sizeof(long) * NBBY / 3) + 1];

    p = buf;
    do {
        *p++ = "0123456789abcdef"[ul % base];
    } while (ul /= base);
    do {
        putchar(*--p);
    } while (p > buf);
} 

但我不想使用 putchar(),只想保存。

4

1 回答 1

2

十进制和八进制是数字基数,这仅在显示数字时(或输入数字时)才重要;实际数字通常以二进制形式存储在计算机内存中,但这对于典型程序通常并不重要。

在您的情况下,转换为八进制通常涉及一次提取三位(因为 2 3是 8)。这可以通过使用掩码7(二进制111)进行掩码,然后移位来完成。这将以从右到左的顺序获得八进制数字。

假设 achar为 8 位(这是典型的),您将生成 3 个八进制数字,因为 3 * 3 = 9。两位数字只会覆盖 6 位,这显然是不够的。

那太少了,您实际上可以“展开”它:

void to_octal(char *buf, unsigned char x)
{
  buf[0] = '0' + ((x >> 6) & 7);
  buf[1] = '0' + ((x >> 3) & 7);
  buf[2] = '0' + (x & 7);
  buf[3] = '\0';
}

请注意,以上要求 buf至少有四个字符的可用空间。用法:

const unsigned char x = 212;
char buf[8];

to_octal(buf, x);
printf("%d is %s in octal\n", x, buf);
于 2013-04-22T06:34:02.073 回答