2011-11-30 26 views
5

見一個情況如何轉換const char字符串中的uint64_t值?

uint64_t trackuid = 2906622092;

現在,我想在一個函數傳遞這個值,其中函數的參數是const char*

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

這應該打印

uid is 2906622092 

我怎麼能做這個?

+0

任何原因該函數不能只是'uint64_t'? – Thanatos

+0

... bcz該函數是一個我不能改變的插件的API –

+2

@Thanatos:對於一個人來說,將一個uid想象成一個字符串並不是那麼不尋常,而另一個人知道他們總是使用一個數字值並且因此它可以表示爲一個整數。 IIRC中,Twitter在其API中有一個選項可以將UID作爲字符串返回,而不是在其JSON響應中返回數字。他們非常*大*號,並且希望幫助那些沒有能夠持有Twitter UID的整數類型的語言。 –

回答

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

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

// call function 
func(buff); 

這需要C99,但是,我的記憶說,MS編譯器不具有PRIu64。 (PRIu64inttypes.h。)YMMV。

+0

+1用於計算緩衝區的最大值大小。 –

+0

這不是計算,而是硬編碼。計算將是'std :: numeric_limits :: digits10 + 1 + std :: numeric_limits :: is_signed + 1',但我們在C ... –

+0

@Maxim Yegorushkin:我喜歡C++的許多事情之一。 – Thanatos

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

sizeof(unsigned long long) == sizeof(uint64_t)

編輯

但更好的答案是馬克西姆Yegorushkin使用"%"PRIu64

+2

但是'long long'的簽名從來就不是'uint64_t'的簽名。如果你要走這條路,爲什麼不使用'unsigned long long'? – Thanatos

8

使用snprintf到數字轉換爲字符串應該工作。對於stdint.h標題的整數類型,請使用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:數組不應該初始化爲0&'snprintf'有一個小於sizeof的終止'NUL'字符? (Ofc你不會在這裏寫255個字符......) –

+1

如果你有足夠大的緩衝區,'sprintf'應該足夠了。否則,another.anon.coward的評論適用。無論哪種方式,'256'都有點矯枉過正,不是嗎?否則,+1是實際使用正確格式說明符的第一篇文章。 – Thanatos

+2

Unix/Linux的'snprintf'總是零終止。 Windows'沒有。 –

相關問題