【问题标题】:What is the standard way to parse floats at runtime in C?在 C 中运行时解析浮点数的标准方法是什么?
【发布时间】:2011-02-07 01:22:54
【问题描述】:

我有一个科学应用程序,我想在运行时为其输入初始值。我可以选择从命令行获取它们,或者从输入文件获取它们。这些选项中的任何一个都输入到通用解析器,该解析器使用 strtod 返回每个模拟运行的初始值的链接列表。我要么使用命令行参数,要么使用 getline() 来读取值。

问题是,我应该滚动自己的解析器,还是应该使用解析器生成器或某个库?标准方法是什么?这是我将在运行时读取的唯一数据,其他一切都在编译时设置(除了输出文件和其他一些完全简单的东西)。

谢谢,

乔尔

【问题讨论】:

  • 你只会读一堆花车?你想做什么样的解析?你有什么语法吗?
  • 是的,只是一堆用空格分隔的浮点数。我正在使用 strtok 阅读它们,由换行符或逗号分隔。我问的原因是这似乎相当复杂,我想知道我是否使用了正确的工具来完成这项工作。不是我介意它涉及的太多,但它是其中一种看似简单且常用的东西,所以似乎应该有一种标准的方法:在 Libc 手册中找不到的东西。
  • 这个问题解决了:我用的是strtod。真正的问题是我需要正确分解问题,以便正确的输入行进入正确的数据结构。

标签: c string simulation bison


【解决方案1】:

一般来说,我更喜欢让数据输入来自文件(例如运行的初始条件、总时间步数等),而标志输入来自命令行(例如输入文件名、输出文件名等)。这允许文件被存档并再次使用,并允许将 cmets 嵌入文件中以帮助解释输入。

如果输入文件具有常规格式:
对于解析,从文件中读取整行,并使用 sscanf 将行“解析”为变量。

如果输入文件的格式不规则: 修复文件格式,使其正常(如果这是一个选项)。 如果没有,那么 strtof 和 strtod 是最好的选择。

【讨论】:

  • 我确实拥有您在第一段中建议的结构。但是,如果他(我)愿意,用户可以选择在命令行上提供一个列表。我通常不会这样做,但它在快速调试会话期间可能很有用。
【解决方案2】:

还可以查看 strtof() 的浮点数, strtod() 的双精度数。

【讨论】:

  • +1。请注意,strtofstrtold(对于 long double)是 C99 规范的一部分。对于 C89/C90,请坚持使用strtod。在我看来,sscanf 通常是矫枉过正,atof 就像是 strtod 的淡化版本,没有任何检查错误的方法。
  • strto*( ) 通常是处理此类事情的正确方法,因为它具有定义明确且有用的错误处理语义。
【解决方案3】:
sscanf

可能是解析它们的标准方法。

但是,sscanf 存在一些问题,尤其是在解析用户输入时。

当然,

atof

【讨论】:

  • 这可能是真的,但你也可以说,为什么没有充分的理由使用它......
  • 使用 atof() 时很难进行正确的错误检查。这里有几个问题是关于 strto*() 集合相对于其他集合的优势。
猜你喜欢
  • 1970-01-01
  • 2016-10-06
  • 2014-05-02
  • 2015-06-14
  • 1970-01-01
  • 2014-01-22
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多