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

Bru*_*rry 6 c++ parsing

我正在尝试编写一个辅助函数,可用于解析配置文件和基于文本的协议(由机器编写,而不是由人编写)的整数.我已经阅读了如何在C++中将字符串解析为int?但那里的解决方案并没有解决所有问题.我想要的东西(从大多数到最不重要):

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

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

alf*_*lfC 1

有一些快速技巧,正常解析(非鲁棒)并在输入中进行一些小检查(例如,如果解析非负数,则检查它没有“-”字符)。

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