在C ++中强大的整数解析

时间:2013-10-28 18:34:37

标签: c++ parsing

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

  1. 拒绝超出范围的值。 strtoul和strtoull并没有完全实现这一点:给定一个前导减号,该值在“返回类型”中被否定。所以“-5”很高兴解析并返回4294967291或18446744073709551611而不是发出错误信号。
  2. 在C语言环境中,无论全局语言环境设置如何(或者更好,请给我一个选择)。除非有一种方法可以在每个线程的基础上设置全局语言环境,否则会排除strtoul,stoul和boost :: lexical_cast,并且只留下istringstream(可以使用某个语言环境)。
  3. 要相当严格。它绝对不能接受拖尾垃圾,理想情况下我也想禁止空白区域。这立即使strtol和任何基于它的东西有点问题。似乎istringstream可以在这里使用noskipws和检查EOF,虽然这可能只是一个GCC错误。
  4. 理想情况下,可以控制是否应该假定基数为10或者应该从0或0x前缀推断。
  5. 关于解决方案的任何想法?是否有一种简单的方法来包装现有的解析机制以满足这些要求,或者最终自己编写解析器的工作量会减少呢?

2 个答案:

答案 0 :(得分:1)

您基本上需要C语言环境的num_get<char>方面。这有点复杂,所以请参阅this example。基本上,您必须致电use_facet<num_get<char,string::iterator> > (locale::classic).get(begin, end, ... , outputValue)

答案 1 :(得分:1)

有一些快速入侵,正常解析(非健壮)并在输入中做一些小检查(例如,如果解析非负数检查它没有' - '字符)。

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