在C语言中,运行时解析浮点数的标准方法是什么?

3
我有一个科学应用程序,我希望在运行时输入初始值。我有一个选项可以从命令行获取它们,或者从输入文件中获取它们。这两个选项都会输入到通用解析器中,该解析器使用strtod返回每个模拟运行的初始值的链表。我要么使用命令行参数,要么使用getline()读取这些值。
问题是,我应该自己编写解析器,还是应该使用解析器生成器或某个库?标准方法是什么?这是我将在运行时读取的唯一数据,其他所有内容都在编译时设置(除了输出文件和一些非常简单的东西)。
谢谢,
乔尔

你只需要读取一堆浮点数吗?你想要进行什么样的解析?你有任何语法规则吗? - LB40
是的,只是一堆用空格分隔的浮点数。我正在使用strtok读取它们,以换行符或逗号为分隔符。我问这个问题的原因是,这似乎相当复杂,我想知道我是否在使用正确的工具来完成工作。并不是说我介意它变得相当复杂,但这似乎是一个简单且常用的事情,因此应该有一种标准的方法来完成它:这是Libc手册中没有找到的东西。 - Joel J. Adamson
这个问题已经解决了:我正在使用strtod。真正的问题是我需要正确地分解问题,以便正确的输入行进入正确的数据结构。 - Joel J. Adamson
3个回答

5
此外,还要查看strtof()用于浮点数,strtod()用于双精度浮点数。

请注意,strtofstrtold(用于 long double)是 C99 规范的一部分。对于 C89/C90,请使用 strtod。在我看来,sscanf 经常过度使用,而 atof 就像是 strtod 的简化版本,没有任何检查错误的方式。 - tomlogic
“strto*()”通常是处理此类事情的正确方式,因为它具有明确定义和有用的错误处理语义。 - Stephen Canon

3
sscanf

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

然而,sscanf存在一些问题,特别是在解析用户输入时。

当然,

atof

这可能是真的,但你也可以说,为什么没有好的理由使用它... - Tuomas Pelkonen
2
使用atof()进行正确的错误检查很困难。这里有一些关于strto*()集合优势的问题。 - Ioan

0
通常情况下,我更喜欢从文件中获取数据输入(例如运行的初始条件、总时间步数等),并从命令行获取标志输入(例如输入文件名、输出文件名等)。这样可以将文件归档并再次使用,并允许在文件中嵌入注释以帮助解释输入。
如果输入文件具有规则格式: 对于解析,从文件中读取完整行,并使用sscanf将该行“解析”为变量。
如果输入文件具有不规则格式: 修复文件格式使其规则化(如果有这个选项)。 如果没有,则strtof和strtod是最佳选择。

我基本上有你在第一段中建议的结构。但是用户可以选择在命令行上提供一个列表,如果他(也就是我)愿意的话。通常我不会这样做,但在快速调试会话期间可能会有用。 - Joel J. Adamson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接