【问题标题】:fprintf 0 gives unexpected results under windows MinGWfprintf 0 在 windows MinGW 下给出了意想不到的结果
【发布时间】:2014-05-22 19:30:38
【问题描述】:

我目前正在将一个 C 项目从 linux 移植到 windows,在此期间我遇到了一个奇怪的错误。在源文件中有这两行:

    fprintf(fp, "%4d %11.6f %11.6f %11.6f\n", cell->total_atom_no, 0, 0, 0);
    printf("%4d %11.6f %11.6f %11.6f\n", cell->total_atom_no, 0, 0, 0);

需要明确的是,文件是以二进制模式“wb”打开的。 文件中的输出为:

      18    0.000000    0.000000 166818935138251830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000

而命令行中的输出是:

      18    0.000000    0.000000    0.000000

命令行版本正确。 但是在 linux 下,文件和命令行都会给出正确的输出。我无法像尝试简单代码一样制作可重现的代码:

    int a = 18;
    fprintf(fp, "%4d %11.6f %11.6f %11.6f\n", a, 0, 0, 0);

它将给出预期的输出。我也不能上传原始文件,因为它有千行长。但它通过编译没有错误,顺便说一句。

此时我真的很困惑,打印0怎么会导致错误?任何有关错误来源的提示将不胜感激。

更新 1

问题似乎与 Gtk 库有关。这个程序有两个版本,一个是命令行,另一个是用 Gtk+2 编写的 GUI。两个版本都使用包含上述代码的同一个文件,但只有 GUI 版本会出现此错误。

那么这似乎是与Gtk库有关的问题,但我不知道进一步调试。

更新 2

我尝试了以下两个修复方法

    fprintf(fp, "%4d %11.6f %11.6f %11.6f\n", cell->total_atom_no, 0, 0, 0.0);
    fprintf(fp, "%4d %11.6f %11.6f %11.6f\n", cell->total_atom_no, 0, 0, (float)0);

错误仍然存​​在。 我可以毫无问题地将这些零打印为 srings,但我需要知道出了什么问题。

【问题讨论】:

  • 可能与您将整数打印为双精度浮点值有关。
  • @JoachimPileborg 不是。正如我提到的,一个简单的例子将给出正确的结果。而且我从来没有遇到过使用 %f 打印整数的问题。
  • undefined behavior 就是这样,即使它看起来有效,但它是不正确的。至于您的编辑,请记住printf (and family) 中的"%f" 格式需要double 作为参数,而不是float
  • @JoachimPileborg 你是对的。我试图将所有三个零都加倍,并且行为恢复正常。非常感谢!你能回答我吗?

标签: c window gtk mingw printf


【解决方案1】:

您对printf 的呼叫会转至undefined behavior。原因是 printf 和家人期望 double 参数为 "%f" 格式。你给它三个 int 值。

由于int(通常在现代平台上)是 32 位,而 double 是 64 位,printf 将超出提供给函数的实际数据,并从堆栈中获取看似随机的数据,可能超出其限制。

【讨论】:

  • 实际上 %f 的预期参数是浮点数,但也可以是双精度数。参数浮点数被转换为双精度,因此将浮点数传递给可变参数函数是完全有效的。
  • @self。 scanf 期望 float 对应 "%f"printf 期望 double
  • float 会自动提升为 double,因此传递浮点数被视为传递双精度数。 6.5.2.2(6) 使其有效。
猜你喜欢
  • 1970-01-01
  • 2019-05-19
  • 2017-01-05
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 2021-04-22
  • 2016-02-13
相关资源
最近更新 更多