2011-11-30 24 views
5

Ver en una situacióncómo convertir el valor de uint64_t en cadena const char?

uint64_t trackuid = 2906622092;

Ahora quiero pasar este valor en una función donde argumento de la función es const char*

func(const char *uid) 
{ 
    printf("uid is %s",uid); 
} 

Esto debería imprimir

uid is 2906622092 

¿Cómo puedo ¿hacer esto?

+0

¿Alguna razón por la cual la función no puede simplemente tomar un 'uint64_t'? – Thanatos

+0

... bcz esa función es una API de algún complemento que no puedo cambiar –

+2

@Thanatos: no es tan extraño que una persona piense en un uid como una cadena, mientras que otra persona sabe que siempre usan un valor numérico y por lo tanto, podría representarse como un número entero. IIRC, Twitter tiene una opción en sus API para devolver los UID como cadenas en lugar de números en sus respuestas JSON. Son números bastante * grandes, y quiere ayudar idiomas que no tienen un tipo entero capaz de contener un UID de Twitter. –

Respuesta

8
// length of 2**64 - 1, +1 for nul. 
char buff[21]; 

// copy to buffer 
sprintf(buff, "%" PRIu64, trackuid); 

// call function 
func(buff); 

Esto requiere C99, sin embargo, mi memoria, dice el compilador MS no tiene PRIu64. (PRIu64 está en inttypes.h.) YMMV.

+0

+1 para calcular el tamaño máximo del buffer ... !!! –

+0

No es cálculo, es una codificación difícil. El cálculo sería 'std :: numeric_limits :: digits10 + 1 + std :: numeric_limits :: is_signed + 1', pero estamos en C ... –

+0

@Maxim Yegorushkin: Una de las muchas cosas que me encanta de C++. – Thanatos

1
char buf[40]; 
memset (buf, 0, sizeof(buf)); 
snprintf (buf, sizeof(buf)-1, "%llu", (unsigned long long) trackuid); 
func(buf); 

debería funcionar cuando sizeof(unsigned long long) == sizeof(uint64_t)

EDITAR

pero la mejor respuesta es por Maxim Yegorushkin utilizar "%"PRIu64

+2

Pero la firma de 'long long' nunca es la de' uint64_t'. ¿Por qué no usar un 'unsigned long long', si vas a seguir por ese camino? – Thanatos

8

Uso snprintf para convertir números a cadenas. Para los tipos enteros del encabezado stdint.h, use las macros de formato de inttypes.h.

#define __STDC_FORMAT_MACROS // non needed in C, only in C++ 
#include <inttypes.h> 
#include <stdio.h> 

void func(const char *uid) 
{ 
    printf("uid is %s\n",uid); 
} 

int main() 
{ 
    uint64_t trackuid = 2906622092; 

    char buf[256]; 
    snprintf(buf, sizeof buf, "%"PRIu64, trackuid); 

    func(buf); 

    return 0; 
} 
+2

nitpick: ¿No debería inicializarse la matriz con 0 y 'snprintf' tener uno menor que sizeof para terminar el carácter' NUL'? (Ofc no escribirá 255 caracteres aquí ...) –

+1

'sprintf' debería ser suficiente, si tiene un buffer suficientemente grande. De lo contrario, se aplica el comentario de another.anon.coward. De cualquier manera, '256' es un poco exagerado, ¿no? De lo contrario, +1 por ser la primera publicación que usa realmente el especificador de formato correcto. – Thanatos

+2

'snprintf' de Unix/Linux siempre termina en cero. Windows uno no. –

Cuestiones relacionadas