【问题标题】:fprintf produces different outputfprintf 产生不同的输出
【发布时间】:2014-08-24 07:33:54
【问题描述】:

我在 C++ Builder 3 和 C++ Builder 5 中编译了下一个程序,它产生了不同的输出:

#include <vcl.h>
#include <stdio.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
  const char filename[] = "C://fprintf-test.txt";
  FILE *file = fopen(filename, "a");

  fprintf(file, "%0*.0f\n", 7,  99999.00);
  fprintf(file, "%0*.0f\n", 7, -99999.00);
  fprintf(file, "%0*.0f\n", 7, -999.00);
  fprintf(file, "%0*.0f\n", 7, 999999.00);
  fprintf(file, "%0*.0f\n", 7, 9.00);

  return 0;
}

C++ Builder 3 中的输出:

0099999
-0099999
-0000999
0999999
0000009

C++ Builder 5 中的输出:

0099999
-099999
-000999
0999999
0000009

您可以清楚地看到负值中 0 的填充不同。为什么是这样?这有记录吗?

提前致谢

【问题讨论】:

  • 为什么用超级人为的例子来展示这个?请在询问时考虑简化事情,以减少噪音。
  • 因为现在人们可以自己测试它,开箱即用。但我会在下一个问题时记住这一点,谢谢:-)
  • 当然,任何问题都应该确保这一点。我想我想知道:您的意思是说,如果您运行一个程序,其main(){ printf("%07.0f\n", -999); return 0; } 组成,即没有文件、其他打印语句和使用* 作为字段宽度?
  • 使用printffprintf 以及使用或不使用* 都没有区别。
  • 格式很好的问题。这肯定是一个 C++ Builder 3 错误。

标签: c c++builder borland-c++


【解决方案1】:

我在 gcc 上试试这个:

// gcc -o test.exe test.c
#include <stdio.h>
int main(int argc, char* argv[])
{
  printf("%0*.0f\n", 7,  99999.00);
  printf("%0*.0f\n", 7, -99999.00);
  printf("%0*.0f\n", 7, -999.00);
  printf("%0*.0f\n", 7, 999999.00);
  printf("%0*.0f\n", 7, 9.00);
  return 0;
}

这是结果:

0099999
-099999
-000999
0999999
0000009

printf 文档说:

width : 要打印的 字符 的最小数量 如果值为 被打印的比这个数字短,结果被填充 [...] 即使结果更大,值也不会被截断。

他们谈论字符(减号是字符)。

我不知道 C++ 构建器。查看 printf C++ builder 文档差异 V3/5。 (这可能是 V3 中的一个错误……)

【讨论】:

  • 是的,输出应该是这样的。但在 BCB3 中,它会产生不同的输出,与 imo 不兼容 ANSI C。我想知道为什么不是,以及记录在哪里。
  • 奇怪的是它没有记录 BCB3 有一个错误,BCB5 修复了它。并非所有错误修复都被记录在案。并且尝试为旧的编译器找到文档将非常困难。
  • 似乎没有关于 QC 的 BCB3 报告 .. 我什至不认为当时存在 QC
【解决方案2】:

正如@chux 在 cmets 中所说:这可能是一个 C++ Builder 3 错误。它没有记录。

如果有人遇到这个问题,我们会这样解决:

fprintf(FileOut, "%0*.*f\n",
#if ( __BORLANDC__ >= 0x560 )
        paddingNumber,
#else
        paddingNumber < 0 ? paddingNumber - 1 : paddingNumber,
        paddingNumber )

【讨论】:

    猜你喜欢
    • 2022-11-13
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 2019-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多