带有 unsigned long long 和 sprintf 的 Visual C++ 6.0

Posted

技术标签:

【中文标题】带有 unsigned long long 和 sprintf 的 Visual C++ 6.0【英文标题】:VisualC++ 6.0 with unsigned long long and sprintf 【发布时间】:2008-10-14 10:36:26 【问题描述】:

我想在 Visual C++ 6.0(纯 C)中 sprintf() 一个 unsigned long long 值。

char buf[1000]; //bad coding 
unsigned __int64 l = 12345678; 
char t1[6] = "test1"; 
char t2[6] = "test2"; 
sprintf(buf, "%lli, %s, %s", l, t1, t2);

给出结果

12345678, (null), test1

(注意test2 没有打印出来)

l = 123456789012345 它给出了一个异常句柄

有什么建议吗?

【问题讨论】:

对不起,我是 ungenau。字符缓冲区[1000]; //错误编码 unsigned __int64 l = 12345678; char t[5] = "测试"; sprintf(buf, "%lli, %s", l, t);给出结果 12345678. (null) 和 l = 123456789012345 它给出了一个异常句柄 @Lytha Alexander,您应该编辑您的问题并将其添加到问题中,而不是添加到评论中。 【参考方案1】:

要在 Visual C++ 6.0 中打印 unsigned __int64 值,您应该使用 %I64u,而不是 %lli(请参阅 MSDN 上的 this page)。 %lli 仅在 Visual Studio 2005 和更高版本中受支持。 所以,你的代码应该是:

sprintf(buf, "%I64u, %s, %s", l, t1, t2);

【讨论】:

【参考方案2】:

printf 使用省略号传递变量参数列表。您看到的 (null) 是 long long 的第二部分,恰好全为 0 位。将其设置为 1

正确的解决方案是将数字分成 10 位的三个部分,“verylongvalue % 10000000000”“(verylongvalue/10000000000) % 10000000000”“verylongvalue/100000000000000000000”。

【讨论】:

【参考方案3】:

显然,您没有将additionaltext 分配给必要的char *(字符串)。请注意,long int 被处理,逗号被复制,只有%s 生成(null)

【讨论】:

以上是关于带有 unsigned long long 和 sprintf 的 Visual C++ 6.0的主要内容,如果未能解决你的问题,请参考以下文章

在 C 中给出 unsigned long long 变量值的警告

如何打印大于“unsigned long long”的“std::bitset”的十进制值?

移位 unsigned char 和 unsigned long long 长期出错

c语言里的无符号unsigned long ulZ = unsigned long dJDM,在java里怎么办?用long型没有c那么大的数值。

如何将 unsigned long long int 转换为 unsigned char*?

char,short ,int ,long,long long,unsigned long long数据范围