<分区>
我正在尝试编写一个辅助函数,该函数可用于从配置文件和基于文本的协议(protocol)(由机器而非人类编写)中解析整数。我读过 How to parse a string to an int in C++?但那里的解决方案并没有解决所有问题。我想要的东西(从最重要到最不重要):
- 拒绝超出范围的值。 strtoul 和 strtoull 并没有完全实现这一点:给定一个前导减号,该值在“返回类型”中被取反。所以“-5”被愉快地解析并返回 4294967291 或 18446744073709551611 而不是发出错误信号。
- 在 C 语言环境中,无论全局语言环境设置如何(或者更好,给我一个选择)。除非有一种方法可以在每个线程的基础上设置全局语言环境,否则排除 strtoul、stoul 和 boost::lexical_cast,而只留下 istringstream(可以在其中注入(inject)语言环境)。
- 相当严格。它绝对不能接受尾随垃圾,理想情况下我也想禁止空白。这立即使 strtol 和任何基于它的东西都有点问题。 istringstream 似乎可以在这里使用 noskipws 并检查 EOF,尽管这可能只是一个 GCC 错误。
- 理想情况下,控制基数是应该假定为 10 还是应该从 0 或 0x 前缀推断出来。
有什么解决方案吗?是否有一种简单的方法来包装现有的解析机制以满足这些要求,或者最终是否会减少自己编写解析器的工作量?