4

我想在 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了一个异常句柄

有什么建议么?

4

3 回答 3

9

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

sprintf(buf, "%I64u, %s, %s", l, t1, t2);
于 2008-10-14T11:19:29.373 回答
1

printf 使用省略号传递变量参数列表。您看到的 (null) 是 long long 的第二部分,恰好都是 0 位。将其设置为 1<<60+1<<30 会导致崩溃,因为 1<<60 部分被解释为 char*。

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

于 2008-10-14T11:13:52.270 回答
-1

显然,您没有分配additionaltext必要的char *(字符串)。请注意,long int已处理 ,复制了逗号,并且仅%s生成了(null).

于 2008-10-14T10:43:26.420 回答