无符号 _int64 的 sprintf

新手上路,请多包涵

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

原文由 venkysmarty 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 806
2 个回答

我不知道 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 。 That’s for long long , but there are no guarantees that long long actually is the same as _int64 (POSIX) or int64_t (C99).

编辑: Mea culpa - 我或多或少无脑地“搜索和替换”了 _int64int64_t 没有真正看我在做什么。感谢评论指出它是 uint64_t ,而不是 unsigned int64_t 。已更正。

原文由 DevSolar 发布,翻译遵循 CC BY-SA 3.0 许可协议

您需要在 Visual C++ 中使用 %I64u

但是,在大多数 C/C++ 编译器上,64 位整数是 long long。因此,采用 long long 并使用 %llu

原文由 Shamim Hafiz - MSFT 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏