【问题标题】:Fscanf not reading floats from file properly into linked listFscanf 没有将文件中的浮点数正确读取到链表中
【发布时间】:2017-03-13 17:20:58
【问题描述】:

所以基本上,使用 C,我正在尝试将文件中的信息读取到链接列表中,当只有价格是浮点数并且大小是字符串但我需要将大小也读取为浮点数时,我可以正常工作. 我正在读这样的文件

fscanf(file,"%[^-]-%f[^:]:%f\n", pLog->name, &pLog->size, &pLog->price);

文件的结构是这样的

bottle-0.33:0.10
bottle-0.50:0.20
bottle-1.50:0.40

现在当我尝试检查结果时

printf("%s %.2f %.2f\n", pLog->name, pLog->size, pLog->price);

它会像这样打印所有内容

bottle 0.33 8290796282473829.00
:0.10 
bottle 0.50 2572489705689592000000000000000000000000000000000000000.00
:0.20
bottle 1.50 0.00
:0.40

有人知道出了什么问题吗?

【问题讨论】:

  • %f[^:]:%f --> %f:%f
  • 哈哈哈小子我是不是觉得自己很蠢。是的,不读取字符串时不需要 [^:] 。谢谢,你的救命稻草。

标签: c floating-point scanf


【解决方案1】:

代码使用了错误的格式@BLUEPIXY

// bottle-0.33:0.10
fscanf(file,"%[^-]-%f[^:]:%f\n", pLog->name, &pLog->size, &pLog->price);

"%[^-]" 匹配 "bottle" 并将文本保存在 pLog->name 中。
"-" 匹配 "-" 并继续扫描。
"%f" 匹配 "0.33" 并将值 0.33 保存在 @987654330 中@.
"["":" 不匹配,因此扫描停止,函数返回 2。
其余格式"^:]:%f\n" 不相关。

使用正确的格式、宽度限制和检查结果。

// assume sizeof pLog->name is 10
if (fscanf(file,"%9[^-]-%f:%f\n", pLog->name, &pLog->size, &pLog->price) == 3) 
  Success();
}

【讨论】:

    【解决方案2】:

    您忘记检查fscanf 的返回值。否则发生了什么就很明显了。

    始终检查您调用的函数的返回值。

    【讨论】:

    • 它返回 2 意味着它只匹配了 2 个值,这是显而易见的。我想知道为什么。
    【解决方案3】:

    将指针传递给 printf() 调用也是一个错误。

      printf("%s %.2f %.2f\n", pLog->name, &pLog->size, &pLog->price);
    

    应该是

     printf("%s %.2f %.2f\n", pLog->name, pLog->size, pLog->price);
                                         ^^^         ^^^ 
    

    FWIW,向格式说明符提供不匹配的参数会调用 undefined behavior

    此外,要匹配"bottle-0.33:0.10" 之类的输入,"%[^-]-%f:%f" 之类的格式说明符也足够了。

    也就是说,始终需要检查scanf() 的返回值和家庭调用,以验证成功。否则,您最终可能会使用一些未初始化的值,这可能会再次导致 UB。

    【讨论】:

    • 抱歉,这是我的写作错误。在代码中是正确的。我打算编辑它,但似乎你太快了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多