带有unsigned long long和sprintf的Visual C ++ 6.0
题
我想在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
它提供了一个异常句柄
有什么建议吗?
解决方案
要在Visual C ++ 6.0中打印unsigned __int64
值,您应该使用%I64u
,而不是%lli
(请参阅此页面。 <=>仅在Visual Studio 2005及更高版本中受支持。
所以,你的代码应该是:
sprintf(buf, "%I64u, %s, %s", l, t1, t2);
其他提示
printf使用省略号传递变量参数列表。你看到的(null)是long long的第二部分,恰好是0位。将它设置为1 <!> lt; <!> lt; 60 + 1 <!> lt; <!> lt; 30并且你会因1 <!> lt; <!> lt; 60部分而崩溃被解释为char *。
正确的解决方案是将数字分成10个数字的三个部分,<!> quot; verylongvalue%10000000000 <!> quot; <!> quot;(verylongvalue / 10000000000)%10000000000 <!> quot; <!> QUOT; verylongvalue / 100000000000000000000 QUOT <!>;
显然,您没有将additionaltext
分配给必要的char *
(字符串)。请注意,long int
已处理,逗号已复制,只有%s
生成的(null)
。
不隶属于 StackOverflow