我有下面的代码。 在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 <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)。
编辑:过失-我或多或少brainlessly“搜索和替换” D的_int64
用int64_t
没有真正在看我在做什么。 感谢您的意见指出,它的uint64_t
,不unsigned int64_t
。 纠正。
您需要使用%I64u用Visual C ++。
然而,在大多数的C / C ++编译器,64位整数是长长。 因此,采用用很长很长 ,并使用%LLU。
如果你正在寻找一个便携式解决方案,然后使用printf的宏从<inttypes.h>
。 您可能需要定义__STDC_FORMAT_MACROS
使这些在C ++中提供。