2011-11-30 10 views
5

Zobacz w jednej sytuacjijak przekonwertować wartość uint64_t w ciąg znaków const?

uint64_t trackuid = 2906622092;

Teraz chcę przekazać tę wartość w jednej funkcji, gdzie argumentem funkcji jest const char*

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

To powinno wydrukować

uid is 2906622092 

Jak mogę Zrób to?

+0

Każdy powód, dla którego funkcja nie może po prostu wziąć "uint64_t"? – Thanatos

+0

... bcz ta funkcja to jeden interfejs API z pewną wtyczką, której nie można zmienić –

+2

@Thanatos: nie jest niczym niezwykłym, aby jedna osoba pomyślała o identyfikatorze jako ciągu, podczas gdy inna osoba wie, że zawsze używa wartości numerycznej i dlatego może być reprezentowany jako liczba całkowita. IIRC, Twitter ma opcję w swoich API, aby zwracać UIDy jako łańcuchy, a nie liczby w odpowiedziach JSON. Są to dość * duże * liczby i chcą pomóc tym językom, które nie mają typu całkowitego, który może posiadać identyfikator UID na Twitterze. –

Odpowiedz

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

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

// call function 
func(buff); 

wymaga C99, jednak moja pamięć mówi kompilator MS nie ma PRIu64. (PRIu64 jest w inttypes.h.) YMMV.

+0

+1 do obliczania maksymalnego rozmiaru bufora .. !!! –

+0

To nie jest obliczanie, raczej trudne kodowanie. Obliczanie byłoby następujące: 'std :: numeric_limits :: digits10 + 1 + std :: numeric_limits :: is_signed + 1', ale jesteśmy w C ... –

+0

@Maxim Yegorushkin: Jedna z wielu rzeczy, które kocham w C++. – Thanatos

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

powinien pracować przy sizeof(unsigned long long) == sizeof(uint64_t)

EDIT

ale lepiej jest odpowiedź Maxim Yegorushkin używać "%"PRIu64

+2

Ale sygnatariusz 'long long' nigdy nie jest z' uint64_t'. Dlaczego nie użyć "unsigned long long", jeśli zamierzasz zejść tą drogą? – Thanatos

8

Korzystając snprintf do konwersji liczb na łańcuchy. Dla typów całkowitych z nagłówka stdint.h użyj makr formatu z 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: Czy tablica nie powinna być inicjowana za pomocą 0 i 'snprintf' ma jedną wartość mniejszą niż sizeof dla zakończenia znaku' NUL'? (Ofc nie napiszesz tutaj 255 znaków ...) –

+1

'sprintf' powinien wystarczyć, jeśli masz wystarczająco duży bufor. W przeciwnym razie zastosowanie ma komentarz innego członka. Tak czy inaczej, '256' jest nieco przesadzone, nie? W przeciwnym razie +1 oznacza bycie pierwszym postem, który faktycznie używa właściwego specyfikatora formatu. – Thanatos

+2

"snprintf" systemu Unix/Linux zawsze kończy się. Windows nie. –

Powiązane problemy