sprintf for unsigned _int64

时间:2011-02-28 10:37:08

标签: c++ c format-specifiers uint64 long-long

我有以下代码。 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 

3 个答案:

答案 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 - 我或多或少地无脑地“搜索并替换”_int64int64_t,而不是真正关注我在做什么。感谢您的评论指出它是uint64_t,而不是unsigned int64_t。校正。

答案 2 :(得分:11)

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