2011-11-30 14 views
5

Vedere in una situazionecome convertire il valore uint64_t nella stringa const char?

uint64_t trackuid = 2906622092;

Ora voglio passare questo valore in una funzione in cui argomento della funzione è const char*

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

Questo dovrebbe stampare

uid is 2906622092 

Come posso Fai questo?

+0

Qualsiasi motivo la funzione non può semplicemente prendere un 'uint64_t'? – Thanatos

+0

... bcz quella funzione è una API di alcuni plugin che non posso cambiare –

+2

@Thanatos: non è poi così insolito che una persona pensi a un uid come una stringa, mentre un'altra persona sa che usa sempre un valore numerico e quindi potrebbe essere rappresentato come un numero intero. IIRC, Twitter ha un'opzione nelle sue API per restituire gli UID come stringhe anziché come numeri nelle sue risposte JSON. Sono abbastanza grandi * numeri e vuole aiutare le lingue che non hanno un tipo intero in grado di contenere un UID di Twitter. –

risposta

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

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

// call function 
func(buff); 

Questo richiede C99, tuttavia, la mia memoria, dice il compilatore MS non ha PRIu64. (PRIu64 è in inttypes.h.) YMMV.

+0

+1 per il calcolo della dimensione massima del buffer .. !!! –

+0

Non sta calcolando, è piuttosto difficile da codificare. Il calcolo sarebbe 'std :: numeric_limits :: digit10 + 1 + std :: numeric_limits :: is_signed + 1', ma siamo in C ... –

+0

@Maxim Yegorushkin: Una delle molte cose che amo del C++. – Thanatos

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

dovrebbe funzionare quando sizeof(unsigned long long) == sizeof(uint64_t)

EDIT

ma la risposta migliore è da Maxim Yegorushkin utilizzare "%"PRIu64

+2

Ma la signness di 'long long' non è mai quella di' uint64_t'. Perché non usare un "non firmato lungo a lungo", se hai intenzione di percorrere quella strada? – Thanatos

8

Usa snprintf per convertire i numeri in stringhe. Per i tipi interi dall'intestazione stdint.h utilizzare i macro di formato da 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: L'array non deve essere inizializzato con 0 & 'snprintf' ha uno in meno di sizeof per terminare il carattere' NUL'? (Ofc non scriverai 255 caratteri qui ...) –

+1

'sprintf' dovrebbe essere sufficiente, se hai un buffer sufficientemente grande. In caso contrario, si applica il commento di another.anon.coward. Ad ogni modo, '256' è un po 'eccessivo, no? Altrimenti, +1 per essere il primo post a utilizzare effettivamente l'identificatore di formato corretto. – Thanatos

+2

'snprintf' di Unix/Linux sempre zero termina. Windows 'uno no. –

Problemi correlati