2011-11-30 27 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'没有。 –

相关问题