模拟基数为36的ulltoa()

时间:2011-08-28 01:28:12

标签: c++ c printf itoa

我需要将无符号的64位整数转换为字符串。这是在Base 36中,或字符0-Z。 Linux联机帮助页中不存在ulltoa。但是sprintf DOES。如何使用sprintf实现所需的结果?即什么格式化的东西?

或者如果snprintf不起作用,那我该怎么做?

1 个答案:

答案 0 :(得分:4)

您可以随时编写自己的转换功能。以下想法是>受this fine answer启发的:

char * int2base36(unsigned int n, char * buf, size_t buflen)
{
  static const char digits[] = "0123456789ABCDEFGHI...";

  if (buflen < 1) return NULL; // buffer too small!

  char * b = buf + buflen;
  *--b = 0;

  do {
    if (b == buf) return NULL; // buffer too small!

    *--b = digits[n % 36];
    n /= 36;
  } while(n);

  return b;
}

这将返回一个指向以null结尾的字符串的指针,该字符串包含n的base36表示,放置在您提供的缓冲区中。用法:

char buf[100];
std::cout << int2base36(37, buf, 100);

如果你想要并且你是单线程的,你也可以使char缓冲区静态 - 我想你可以找到一个合适的最大长度:

char * int2base36_not_threadsafe(unsigned int n)
{
  static char buf[128];
  static const size_t buflen = 128;

  // rest as above