sprintf的无符号_int64sprintf的无符号_int64(sprintf for uns

2019-05-12 04:39发布

我有下面的代码。 在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 

Answer 1:

我不知道是什么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的_int64int64_t没有真正在看我在做什么。 感谢您的意见指出,它的uint64_t ,不unsigned int64_t 。 纠正。



Answer 2:

您需要使用%I64u用Visual C ++。

然而,在大多数的C / C ++编译器,64位整数是长长。 因此,采用用很长很长 ,并使用%LLU。



Answer 3:

如果你正在寻找一个便携式解决方案,然后使用printf的宏从<inttypes.h> 。 您可能需要定义__STDC_FORMAT_MACROS使这些在C ++中提供。



文章来源: sprintf for unsigned _int64