我有以下代码。 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
答案 0 :(得分:14)
您需要在Visual C ++中使用%I64u 。
但是,在大多数C / C ++编译器中,64位整数很长。因此,采用 long long 并使用%llu 。
答案 1 :(得分:13)
我不知道POSIX对此有什么看法,但核心C99很好地处理了这个问题:
#include <stdio.h>
#include <inttypes.h>
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
与int64_t
,而不是真正关注我在做什么。感谢您的评论指出它是uint64_t
,而不是unsigned int64_t
。校正。
答案 2 :(得分:11)
如果您正在寻找便携式解决方案,请使用<inttypes.h>
中的printf macros。您可能需要定义__STDC_FORMAT_MACROS
以使其在C ++中可用。