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