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 ++中可用。