如何将uint64_t值转换为const char字符串?

6

在某种情况下

uint64_t trackuid = 2906622092;

现在我想将这个值传递给一个函数,该函数的参数是const char*

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

这应该打印出来。
uid is 2906622092 

我该怎么做?


函数为什么不能直接使用 uint64_t - Thanatos
因为那个函数是某个插件的一个API,我无法更改。 - Jeegar Patel
3
@Thanatos表示,一个人认为uid是字符串并非不寻常,而另一个人知道他们总是使用数字值,因此它可以表示为整数。如果我没记错,Twitter在其API中有一个选项,可以在其JSON响应中将UID作为字符串而不是数字返回。这些数字相当,Twitter希望帮助那些没有能够容纳Twitter UID的整数类型的语言。 - Steve Jessop
@SteveJessop 我同意你的观点。这是一个很好的例子,给你点赞。 - Jeegar Patel
3个回答

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

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

// call function
func(buff);

这需要C99,但是我的记忆告诉我微软编译器没有PRIu64。(PRIu64inttypes.h中。)可能会有所不同。


它不是计算,而是硬编码。计算应该是std::numeric_limits<T>::digits10 + 1 + std::numeric_limits<T>::is_signed + 1,但我们在C中... - Maxim Egorushkin
1
@Maxim:或者在C语言中,(((sizeof(T) * CHAR_BIT) + 2)/3)+2可以给出一个相当简单的上限,尽管它不是一个紧密的上限。 +2)/3是为了向上舍入除以3,3是10的以2为底的对数的近似值,+2是一个用于空字节和一个用于符号的,虽然在这种情况下我们有一个无符号类型,所以我们可以省略它。 - Steve Jessop
@MaximEgorushkin - 所以用C++会更好吗?char buff [std :: numeric_limits <uint64_t> :: digits10 + 1 + std :: numeric_limits <uint64_t> :: is_signed + 1];sprintf(buff,“%”PRIu64,trackuid); - davidkomer
1
@davidkomer 你还需要为前导数字加上+1,以及为零终止符加上+1。 - Maxim Egorushkin

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
吹毛求疵:数组不应该用0初始化,而且snprintf的大小应该比终止的NUL字符小1个。当然,你不会在这里写255个字符... - another.anon.coward
1
如果您有足够大的缓冲区,那么sprintf就足够了。否则,另一个匿名者的评论适用。无论哪种方式,256都有点过头了,不是吗?否则,因为这是第一个实际使用正确格式说明符的帖子,所以+1。 - Thanatos
2
Unix/Linux的snprintf总是以零终止。而Windows的则不会。 - Maxim Egorushkin
@Maxim Yegorushkin:这个我不知道。我以为它们都有问题没有终止。看起来POSIX甚至说它们应该终止,而Windows是独立的。 - Thanatos
1
@Maxim:Windows没有snprintf函数,但它确实有一个几乎完全不相关的函数_snprintf;-) - Steve Jessop

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)的情况下工作

编辑

但更好的答案是Maxim Yegorushkin提供的"%"PRIu64


2
但是 long long 的有符号性永远不会与 uint64_t 相同。如果你要走这条路,为什么不使用 unsigned long long 呢? - Thanatos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接