2008-10-14 44 views
4

我想的sprintf()在Visual C++ 6.0(纯C)一个无符号长长值。VISUALC++ 6.0长长无符号和sprintf

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 = 123456789它给出了一个例外处理

任何建议?

+0

对不起,我是ungenau。 char buf [1000]; //错误编码 unsigned __int64 l = 12345678; char t [5] =“test”; 的sprintf(buf中, “%LLI,%S”,L,T); 给出结果 12345678(空) 和L = 123456789它提供了一个异常处理 – 2008-10-14 10:49:24

+1

@Lytha亚历山大,你应该修改你的问题,这增加了问题,而不是在注释中添加。为造就椭圆 – 2008-10-14 11:32:18

回答

9

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

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

显然,您没有将additionaltext分配到必需的char *(字符串)。注意,long int被处理,逗号被复制,仅产生%s(null)

1

的printf使用省略号来传递变量参数列表。你看到的(null)是你长整数的第二部分,它恰好都是0位。它设置为1 < < 60 + 1 < < 30和1 < < 60部分被解释为一个字符,你会得到一个崩溃*。

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

+0

感谢,我也忘了,事情 – 2008-10-14 14:24:36