【问题标题】:fscanf() behaves differently on different machinesfscanf() 在不同的机器上表现不同
【发布时间】:2012-07-02 03:07:57
【问题描述】:

下面这行代码应该读取一个字符串、一个整数和两个用逗号分隔的双精度数并将它们存储在变量中。

fscanf(f,"%[^,],%d,%Lf,%Lf",name,&id,&east, &north);

它适用于我的 Visual Studio 2010 编译器并读取正确的值。我已经在另一台机器上运行该程序,在该机器上我有三个数字的随机值,但字符串的值是正确的。

会是什么?

【问题讨论】:

  • %Lf 转换说明符用于long double,而不用于double%lf 用于double
  • %Lf 是为long double 而不是普通的double。对于 Microsoft 编译器,long double 的大小与 double 相同,但其他编译器具有扩展大小的 long double。我不知道 int 出了什么问题,除非 id 实际上很长并且您有 32 位/64 位不匹配?
  • 你们为什么不把它作为答案发布?这很可能是问题所在。
  • 好的,是的,我狙击了这个,但是将答案作为评论而不是答案发布确实不是正确使用 SO...
  • 另一台机器上的操作系统和编译器是什么?您是否检查了来自fscanf() 的返回值,所以您知道有多少转化有效?如果fscanf() 没有报告 4,那么你就有问题了。另一个编译器是gcc 吗?如果是这样,当您使用 -Wall 启用警告时它告诉您什么?

标签: c scanf


【解决方案1】:

%Lf 用于类型 long double,而不是 double。在 Microsoft 编译器上,long doubledouble 具有相同的大小和表示形式,因此它恰好可以工作,但是您的代码仍然通过使用不匹配的格式说明符来调用未定义的行为。使用%lfdouble,或者如果你想使用%Lf,将类型更改为long double,它应该可以在任何地方使用。

【讨论】:

    猜你喜欢
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 2021-08-16
    • 2019-09-25
    相关资源
    最近更新 更多