【发布时间】:2013-09-02 19:51:55
【问题描述】:
我今天遇到了printf() 的一个奇怪问题。但是即使分析了它,我也找不到它的答案。因此在这里分享。我尝试了这三个printf() 语句:
printf("\nValue of this division is %f", (double)873/(double)65);
它按预期打印正确的输出。
printf("\nSome message with an integer here %d followed by floats %f, %f, %f", 2013, 987/432, 873/65, 983/81);
给了我错误的值(因为我没有将它们转换成双倍?)
printf("\nSome message with an integer here %d followed by floats %f, %f, %f and now string at end: %s", 2013, 987/432, 873/65, 983/81, "Some trial string here");
printf() 在这里崩溃了!这引发了我两个问题:
我在 MSDN 中看到了“FormatOutput(LPCSTR formatstring, ...)”示例,他们在其中分配固定宽度的目标缓冲区,然后用它调用
vsnprintf()。我相信printf()也是如此。但我没有找到printf()的内部缓冲区大小。如果它动态分配内存,那么它如何计算缓冲区大小?printf()在上面的行崩溃,因为vsnprintf()也在那里崩溃(是的,我尝试使用上述参数为vsnprintf()给出的FormatOutput示例代码)。但是为什么最终会崩溃呢?
【问题讨论】:
-
您正在投射到
double,尝试投射到float。 -
@JonathanPotter,反正他们不会升职吗?
-
@Jonathan Potter:如果我没记错的话,变量参数列表首先将
floats 转换为double。 -
好的,继续,这里没什么可看的:)
-
@Andrew:您可能需要检查编译器开关。我知道 gcc 实际上能够在编译时解析
printf (...)格式字符串并验证您传递的参数列表,而且我相信我已经看到 Microsoft Visual C 的较新版本也这样做了。使用正确的开关,可以将它们设置为警告您执行此类操作。 (当格式需要双精度时传递整数值)