输出float和double变量时sprintf输出的最大字符数是多少?

Alm*_*lmo 5 c printf

如果我这样做:

void printfloat(float number)
{
    printf("%f", number);
}
Run Code Online (Sandbox Code Playgroud)

void printdouble(double number)
{
    printf("%f", number);
}
Run Code Online (Sandbox Code Playgroud)

每个函数可以输出的最大字符数是多少?

小智 6

通过测试,使用MS Visual Studio 10,得到一串811

sprintf(buf, "%.*f", 500, -DBL_MAX);
Run Code Online (Sandbox Code Playgroud)

当然,更长的字符串可以具有更大的精度值。

但继续使用“%f”,“\0”的最大输出字符数为 317 + 1。
所以对于可移植代码:

#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);
Run Code Online (Sandbox Code Playgroud)

函数 printfloat(float number) 的唯一参数“number”是一个浮点数并且限制在浮点数的范围内,在传递给 sprintf() 时被转换为双精度数。因此它的最大值是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);
Run Code Online (Sandbox Code Playgroud)


Alm*_*lmo 2

结论:

我无法让 snprintf 告诉我字符串有多大,并且我希望使代码尽可能独立于编译器。所以这是我想出的解决方案。

char numstr[50];
sprintf_s(numstr, "%g", *value);
m_stringRepresentation += numstr;
Run Code Online (Sandbox Code Playgroud)

%g 以科学记数法输出数字,这严重限制了字符数。我选择了一个足够大的缓冲区来容纳可能输出的任何内容。我唯一的编译器依赖是 sprintf_s。