如何在没有标准C函数(如print)的情况下以八进制格式转换char

时间:2013-04-22 06:28:52

标签: c++ c linux unix

需要将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(),只想保存。

1 个答案:

答案 0 :(得分:2)

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

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

假设8位的char(这是典型的),你将生成3个八位数,因为3 * 3 = 9.两个数字只能覆盖6位,这显然是不够的。< / p>

这太少了,你实际上可以“展开”它:

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);