c++ - 如何在没有 print(f) 等标准 C 函数的情况下将 char 转换为八进制格式

标签 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(),只想保存。

最佳答案

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

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

假设 char 为 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);

关于c++ - 如何在没有 print(f) 等标准 C 函数的情况下将 char 转换为八进制格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16140723/

相关文章:

c++ - 如何重装cudnn?

c++ - 改进此搜索的性能?

c++ - 动态转换和静态转换的奇怪行为

c++ - 未排序矩阵搜索算法

c - 了解与结构数组相关的 Malloc 和 Realloc

C 链表错误未正确链接

c - 将 c 函数移植到 NASM

c++ - 在数据轰炸时优化 QPlainTextEdit 小部件?

linux - Vim 以插入模式启动并插入特殊字符

linux - 如何在 linux 上运行 aout?