sprintf for unsigned _int64

我有以下代码。 sprintf中第二个%d的输出始终显示为零。 我想我指的是错误的说明符。 任何人都可以帮助我获得具有正确值的写字符串。 这必须以posix标准实现。 感谢您的投入

void main() { unsigned _int64 dbFileSize = 99; unsigned _int64 fileSize = 100; char buf[128]; memset(buf, 0x00, 128); sprintf(buf, "\nOD DB File Size = %d bytes \t XML file size = %d bytes", fileSize, dbFileSize); printf("The string is %s ", buf); } 

输出:

 The string is OD DB File Size = 100 bytes XML file size = 0 bytes 

我不知道POSIX对此有何看法,但核心C99很好地处理了这个问题:

 #include  #include  int main(void) { uint64_t dbFileSize = 99; uint64_t fileSize = 100; char buf[128]; memset(buf, 0x00, 128); sprintf( buf, "\nOD DB File Size = %" PRIu64 " bytes \t" " XML file size = %" PRIu64 " bytes\n" , fileSize, dbFileSize ); printf( "The string is %s\n", buf ); } 

如果您的编译器不符合C99,请使用其他编译器。 (是的,我正在看着你,Visual Studio。)

PS:如果您担心可移植性, 请不要使用%lld 。 这long long ,但不能保证long long实际上与_int64 (POSIX)或int64_t (C99)相同。

编辑: Mea culpa – 我或多或少无脑地用“ int64_t搜索和替换” _int64 ,而没有真正看到我在做什么。 感谢评论指出它是uint64_t ,而不是unsigned int64_t 。 纠正。

您需要在Visual C ++中使用%I64u

但是,在大多数C / C ++编译器中,64位整数很长。 因此,采用使用%llu

如果您正在寻找便携式解决方案,请使用 printf宏 。 您可能需要定义__STDC_FORMAT_MACROS以使其在C ++中可用。