C++ C+中整数的鲁棒解析+;
我正在尝试编写一个helper函数,该函数可用于解析配置文件和基于文本的协议(由机器编写,而不是由人工编写)中的整数。我读过,但解决方案并没有解决所有问题。我想要的东西(从最重要到最不重要):C++ C+中整数的鲁棒解析+;,c++,parsing,C++,Parsing,我正在尝试编写一个helper函数,该函数可用于解析配置文件和基于文本的协议(由机器编写,而不是由人工编写)中的整数。我读过,但解决方案并没有解决所有问题。我想要的东西(从最重要到最不重要): 拒绝超出范围的值。strtoul和strtoull并不能完全实现这一点:给定一个前导减号,“在返回类型中”该值被否定。因此“-5”被愉快地解析并返回4294967291或18446744073709551611,而不是发出错误信号 在C语言环境中,不管全局语言环境设置如何(或者更好,给我一个选择)。除非有
有什么解决办法吗?有没有一种简单的方法来包装现有的解析机制以满足这些需求,或者自己编写解析器的工作量会更少?您基本上想要C语言环境的
num\u get
方面。这有点复杂,所以请看。基本上,您必须调用use_facet(locale::classic).get(begin,end,…,outputValue)
有一些快速的技巧,按正常方式解析(非健壮性),并在输入中执行一些小检查(例如,如果解析非负数,请检查它没有“-”字符)
健壮性的最终测试是将整数转换回文本,并检查输入文本和输出文本是否相同。在文本版本中工作时,您可以放松一些,比如接受前导0或空格。如果是由机器编写的,为什么值超出范围?听起来您需要开发自己的。或者找到一个习惯library@andre范围验证更多地用于配置文件解析(由人工编写)。但是,验证通过网络接收到的任何数据也是谨慎的。信任和责任。一旦用户输入了无效数据,就应该通知他们,将其发送给解析器是非常糟糕的。同样对于网络,应用程序的网络层负责确保数据的安全,如果您不信任它,那么谁说超出范围的数据将是您唯一的问题。可能通过正则表达式运行字符串以“预解析”并在转换为整数之前验证字符串本身。这与使用istringstream基本相同,因为这是operator>>在后台使用的。开销可能会有所减少,但它仍然接受负值并将其包装。@Brucemery:它确实在减少开销;这并不是说有很多不同的实现。至于负数,请检查它是否往返:您能取回原始字符串吗?