6

我正在尝试编写一个辅助函数,该函数可用于从配置文件和基于文本的协议(由机器编写,而不是由人编写)中解析整数。我已阅读如何在 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 前缀推断。

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

4

2 回答 2

1

您基本上想要num_get<char>C 语言环境的方面。这有点复杂,所以看这个例子。基本上,您必须调用use_facet<num_get<char,string::iterator> > (locale::classic).get(begin, end, ... , outputValue).

于 2013-10-28T23:40:25.730 回答
1

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

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

于 2013-10-28T23:47:34.660 回答