在某种情况下
uint64_t trackuid = 2906622092;
现在我想将这个值传递给一个函数,该函数的参数是const char*
func(const char *uid)
{
printf("uid is %s",uid);
}
这应该打印出来。
uid is 2906622092
我该怎么做?
在某种情况下
uint64_t trackuid = 2906622092;
现在我想将这个值传递给一个函数,该函数的参数是const char*
func(const char *uid)
{
printf("uid is %s",uid);
}
uid is 2906622092
我该怎么做?
// length of 2**64 - 1, +1 for nul.
char buff[21];
// copy to buffer
sprintf(buff, "%" PRIu64, trackuid);
// call function
func(buff);
这需要C99,但是我的记忆告诉我微软编译器没有PRIu64
。(PRIu64
在inttypes.h
中。)可能会有所不同。
std::numeric_limits<T>::digits10 + 1 + std::numeric_limits<T>::is_signed + 1
,但我们在C中... - Maxim Egorushkin(((sizeof(T) * CHAR_BIT) + 2)/3)+2
可以给出一个相当简单的上限,尽管它不是一个紧密的上限。 +2)/3
是为了向上舍入除以3,3是10的以2为底的对数的近似值,+2是一个用于空字节和一个用于符号的,虽然在这种情况下我们有一个无符号类型,所以我们可以省略它。 - Steve Jessop使用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;
}
snprintf
的大小应该比终止的NUL
字符小1个。当然,你不会在这里写255个字符... - another.anon.cowardsprintf
就足够了。否则,另一个匿名者的评论适用。无论哪种方式,256
都有点过头了,不是吗?否则,因为这是第一个实际使用正确格式说明符的帖子,所以+1。 - Thanatossnprintf
总是以零终止。而Windows的则不会。 - Maxim Egorushkinsnprintf
函数,但它确实有一个几乎完全不相关的函数_snprintf
;-) - Steve Jessopchar 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
long long
的有符号性永远不会与 uint64_t
相同。如果你要走这条路,为什么不使用 unsigned long long
呢? - Thanatos
uint64_t
? - Thanatos