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

时间:2011-08-29 20:19:43

标签: c printf

如果我这样做:

void printfloat(float number)
{
    printf("%f", number);
}

void printdouble(double number)
{
    printf("%f", number);
}

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

3 个答案:

答案 0 :(得分:3)

通过测试,使用MS Visual Studio 10,由

生成一串811
sprintf(buf, "%.*f", 500, -DBL_MAX);

当然,使用更大的精度值可能会有更长的字符串。

但保留“%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);

函数printfloat(float number)单独的参数“number”,作为一个float并限制在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);

答案 1 :(得分:2)

结论:

我无法让snprintf告诉我字符串有多大,我希望尽可能保持代码与编译器无关。所以这是我提出的解决方案。

char numstr[50];
sprintf_s(numstr, "%g", *value);
m_stringRepresentation += numstr;

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

答案 2 :(得分:1)

通过wc -c传送的快速测试程序显示浮动47个字符,双重317个字符。该计划:

#include <stdio.h>
#include <float.h>

int main(void) {
        printf("%f", -DBL_MAX);
}

请注意,您可以使用snprintf将输出限制为n个字符。