模拟ulltoa(),基数/底数为36

simulate ulltoa() with a radix/base of 36

本文关键字:基数 ulltoa 模拟      更新时间:2023-10-16

我需要将一个无符号64位整数转换为字符串。也就是36进制,或者0-Z字符。Linux手册中不存在ulltoa。但sprint做到了。我如何使用冲刺来达到预期的结果?例如,格式化%的东西?

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

您总是可以编写自己的转换函数。下面的想法是中偷来的,很大程度上受到这个好答案的启发:

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 * int2base36_not_threadsafe(unsigned int n)
{
  static char buf[128];
  static const size_t buflen = 128;
  // rest as above