如果我这样做:
void printfloat(float number)
{
printf("%f", number);
}
并且
void printdouble(double number)
{
printf("%f", number);
}
每个函数可以输出的最大字符数是多少?
通过使用MS Visual Studio 10进行测试,得出了一个字符串811的结果。
sprintf(buf, "%.*f", 500, -DBL_MAX);
当然,使用更大的精度值可以生成更长的字符串。
但是,如果使用 "%f",输出的最大字符数为 317 + 1(包括 '\0')。
因此,为了编写可移植的代码:
#include <float.h>
#include <stdio.h>
char buf[1/*'-'*/ + (DBL_MAX_10_EXP+1)/*308+1 digits*/ + 1/*'.'*/ + 6/*Default? precision*/ + 1/*\0*/];
sprintf(buf, "%f", -DBL_MAX);
函数printfloat(float number)只有一个参数"number",该参数是浮点数,并且范围受限于float类型。它被传递给sprintf()时会被转换成double类型。因此,它的最大值为FLT_MAX。因为最后要加上'\0',所以输出的字符数最多为47 + 1。
char buf[1/*'-'*/ + (FLT_MAX_10_EXP+1)/*38+1 digits*/ + 1/*'.'*/ + 6/*Default? precision*/ + 1/*\0*/];
sprintf(buf, "%f", -FLT_MAX);
结论:
我无法通过使用snprintf函数来获取字符串的大小,而且我希望代码尽可能地与编译器独立。因此,这里是我想出的解决方案。
char numstr[50];
sprintf_s(numstr, "%g", *value);
m_stringRepresentation += numstr;
%g会以科学计数法输出数字,这严重限制了字符的数量。我选择了一个足够大的缓冲区来容纳任何可能的输出。我的唯一编译器依赖是sprintf_s。
#include <stdio.h>
#include <float.h>
int main(void) {
printf("%f", -DBL_MAX);
}
snprintf(NULL, 0, ...);
来查找需要多少缓冲区字符,以便您可以分配相应数量的空间。 - Chris Lutz
printf
不接受指针,它接受的是浮点值本身;%lf
格式说明符仅适用于scanf
--对于printf
没有意义(§7.20.6.1第7段:“长度修饰符及其含义为...l
...对于后面的a、A、e、E、f、F、g或G转换说明符没有影响。”) - Stephen Canon