C++ C+中整数的鲁棒解析+;

C++ C+中整数的鲁棒解析+;,c++,parsing,C++,Parsing,我正在尝试编写一个helper函数,该函数可用于解析配置文件和基于文本的协议(由机器编写,而不是由人工编写)中的整数。我读过,但解决方案并没有解决所有问题。我想要的东西(从最重要到最不重要): 拒绝超出范围的值。strtoul和strtoull并不能完全实现这一点:给定一个前导减号,“在返回类型中”该值被否定。因此“-5”被愉快地解析并返回4294967291或18446744073709551611,而不是发出错误信号 在C语言环境中,不管全局语言环境设置如何(或者更好,给我一个选择)。除非有

我正在尝试编写一个helper函数,该函数可用于解析配置文件和基于文本的协议(由机器编写,而不是由人工编写)中的整数。我读过,但解决方案并没有解决所有问题。我想要的东西(从最重要到最不重要):

  • 拒绝超出范围的值。strtoul和strtoull并不能完全实现这一点:给定一个前导减号,“在返回类型中”该值被否定。因此“-5”被愉快地解析并返回4294967291或18446744073709551611,而不是发出错误信号
  • 在C语言环境中,不管全局语言环境设置如何(或者更好,给我一个选择)。除非有办法在每个线程的基础上设置全局区域设置,否则就排除了strtoul、stoul和boost::lexical_cast,只剩下istringstream(可以在其中嵌入区域设置)
  • 要相当严格。它绝对不能接受拖尾垃圾,理想情况下,我也想禁止空白。这立刻使strtol和基于它的任何东西都有点问题。看起来istringstream可以在这里使用noskipws并检查EOF,尽管这可能只是一个GCC错误
  • 理想情况下,提供一些控制,到底是假定基数为10,还是从0或0x前缀推断基数

  • 有什么解决办法吗?有没有一种简单的方法来包装现有的解析机制以满足这些需求,或者自己编写解析器的工作量会更少?

    您基本上想要C语言环境的
    num\u get
    方面。这有点复杂,所以请看。基本上,您必须调用
    use_facet(locale::classic).get(begin,end,…,outputValue)

    有一些快速的技巧,按正常方式解析(非健壮性),并在输入中执行一些小检查(例如,如果解析非负数,请检查它没有“-”字符)


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

    如果是由机器编写的,为什么值超出范围?听起来您需要开发自己的。或者找到一个习惯library@andre范围验证更多地用于配置文件解析(由人工编写)。但是,验证通过网络接收到的任何数据也是谨慎的。信任和责任。一旦用户输入了无效数据,就应该通知他们,将其发送给解析器是非常糟糕的。同样对于网络,应用程序的网络层负责确保数据的安全,如果您不信任它,那么谁说超出范围的数据将是您唯一的问题。可能通过正则表达式运行字符串以“预解析”并在转换为整数之前验证字符串本身。这与使用istringstream基本相同,因为这是operator>>在后台使用的。开销可能会有所减少,但它仍然接受负值并将其包装。@Brucemery:它确实在减少开销;这并不是说有很多不同的实现。至于负数,请检查它是否往返:您能取回原始字符串吗?