simular ulltoa () con una raíz / base de 36

Necesito convertir un entero de 64 bits sin firmar en una cadena. Eso está en Base 36, o caracteres 0-Z. ulltoa no existe en las páginas de manual de Linux. Pero sprintf SÍ. ¿Cómo utilizo sprintf para lograr el resultado deseado? es decir, ¿qué% cosas de formato?

O si snprintf no funciona, ¿cómo hago esto?

preguntado el 28 de agosto de 11 a las 01:08

posible duplicado de sprintf para _int64 sin firmar -

@Code Esto es específicamente base 36, no creo que sea un dup. -

No creas que puedes usar sprintf para hacer esto -

1 Respuestas

Siempre puede escribir su propia función de conversión. La siguiente idea es robado de fuertemente inspirado por esta buena respuesta:

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

Esto devolverá un puntero a una cadena terminada en nulo que contiene la representación base36 de n, colocado en un búfer que usted proporcione. Uso:

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

Si lo desea y tiene un solo subproceso, también puede hacer que el búfer de caracteres sea estático; supongo que puede encontrar una longitud máxima adecuada:

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

  // rest as above

contestado el 23 de mayo de 17 a las 15:05

Esto supone que el búfer está lleno de NULLs al principio. Si tiene un búfer de tamaño 32 y usa esta función e imprime el búfer y el búfer no estaba lleno de nulos, imprimirá hasta el tamaño del búfer (pero no más) el número de caracteres erróneos. - Seth Carnegie

También esta función acepta unsigned int que no es (supongo) 64 bits en un sistema de 32 bits. Debiera ser unsigned long long ¿derecho? - Seth Carnegie

@Pete: Para ser justos, prácticamente le estoy robando esta idea a esta respuesta después de muchas críticas que recibí por proponer un malloc()-Solución a base de Su enfoque requiere que pases el final de la cadena, mientras que yo elegí comenzar más longitud aquí, en la versión segura para subprocesos. La versión insegura es incluso más fácil de usar, por supuesto. ¡Agregaré los créditos! - Kerrek SB

@Seth: No entiendo tu objeción. Devuelvo un puntero a una cadena bien definida, debidamente terminada en nulo. Sí, el tipo integral no tiene un ancho específico en mi ejemplo, pero confío en que el OP pueda modificar esto a su gusto. - Kerrek SB

@Kerrek tu respuesta actualizada no tiene el problema que tenía antes. - Seth Carnegie

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.