c++ - C++ 中整数的稳健解析

标签 c++ parsing

<分区>

我正在尝试编写一个辅助函数,该函数可用于从配置文件和基于文本的协议(protocol)(由机器而非人类编写)中解析整数。我读过 How to parse a string to an int in C++?但那里的解决方案并没有解决所有问题。我想要的东西(从最重要到最不重要):

  1. 拒绝超出范围的值。 strtoul 和 strtoull 并没有完全实现这一点:给定一个前导减号,该值在“返回类型”中被取反。所以“-5”被愉快地解析并返回 4294967291 或 18446744073709551611 而不是发出错误信号。
  2. 在 C 语言环境中,无论全局语言环境设置如何(或者更好,给我一个选择)。除非有一种方法可以在每个线程的基础上设置全局语言环境,否则排除 strtoul、stoul 和 boost::lexical_cast,而只留下 istringstream(可以在其中注入(inject)语言环境)。
  3. 相当严格。它绝对不能接受尾随垃圾,理想情况下我也想禁止空白。这立即使 strtol 和任何基于它的东西都有点问题。 istringstream 似乎可以在这里使用 noskipws 并检查 EOF,尽管这可能只是一个 GCC 错误。
  4. 理想情况下,控制基数是应该假定为 10 还是应该从 0 或 0x 前缀推断出来。

有什么解决方案吗?是否有一种简单的方法来包装现有的解析机制以满足这些要求,或者最终是否会减少自己编写解析器的工作量?

最佳答案

有一些快速技巧,正常解析(非稳健)并在输入中做一些小检查(例如,如果解析一个非负数,检查它是否没有“-”字符)。

鲁棒性的最终测试是将整数转换回文本,并检查输入文本和输出文本是否相同。在文本版本中工作时,您可以放轻松,例如接受前导 0 或空格。

关于c++ - C++ 中整数的稳健解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19642490/

相关文章:

c++ - 指针立即为 0x0

c++ - 使用 OpenCV 的 imread() 从 qrc 读取图像

c++ - 当不应调用构造函数时,复制参数会调用已删除的构造函数

java - 如何解析包含与我用作分隔符相同的符号的字符串?

c++ - 将另一个实例添加到同一 vector 后,对成员变量的引用中断

c++ - Linux LibdvbV5 EIT 抢夺 - 天数不够

html - 在 perl 中解析表数据时遇到问题

php - PHP解析/语法错误;以及如何解决它们

php - 解析 WordPress 帖子内容

c++ - C++ 中的 bool 表达式解析器