【问题标题】:What are the maximum numbers of characters output by sprintf when outputting float and double variables?sprintf在输出float和double变量时输出的最大字符数是多少?
【发布时间】:2011-08-29 20:19:42
【问题描述】:

如果我这样做:

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

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

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

【问题讨论】:

  • 我不想控制它。我想打印它通常会打印的所有内容,并且知道最大值是多少。
  • 部分问题已经得到解答。至少双打:stackoverflow.com/questions/1701055/…
  • 太棒了。发帖前搜了一下,没找到。它也不是从问题前搜索中出现的。
  • @Doug T.: printf 不带指针,它本身带浮点值; %lf 说明符仅对 scanf 需要 - 它对 printf 没有意义(§7.20.6.1 第 7 段:“长度修饰符及其含义是 ... l ... 没有效果在后面的 a、A、e、E、f、F、g 或 G 转换说明符上。")

标签: c printf


【解决方案1】:

通过测试,使用 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”是一个浮点数并限制在浮点数的范围内,在传递给 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);

【讨论】:

    【解决方案2】:

    结论:

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

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

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

    【讨论】:

      【解决方案3】:

      通过 wc -c 传输的快速测试程序显示浮点数为 47 个字符,双精度数为 317。程序:

      #include <stdio.h>
      #include <float.h>
      
      int main(void) {
              printf("%f", -DBL_MAX);
      }
      

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

      【讨论】:

      • 或使用snprintf(NULL, 0, ...); 找出缓冲区需要多少字符,以便分配那么多字符。
      • 我可能会在此评论中使用 snprintf 解决方案。从我对该主题的其他阅读来看,我不是 100% 相信 317 是最大值。我基本上相信,但还不足以用它发布关键任务代码。 :)
      • snprintf 没有在我们的代码库中定义。我尝试了#include "stdio.h" 但没有成功。
      • @Almo 如果您使用 MSVC,请尝试使用 _snprintf
      • _snprintf_s 只是告诉我我给它的缓冲区太小了。如果我需要知道缓冲区必须有多大才能告诉我需要多大的缓冲区,我看不到重点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-31
      相关资源
      最近更新 更多