我遇到了一个烦人的问题,我写的是C ++函数,其目的是验证用户输入。该函数读取用户输入,验证它是否为数字,如果是,则验证它是否在[min,max]范围内。
当我使用无符号类型调用模板函数(例如size_t
)并且输入为负数时,会出现问题。字符串流将字符串转换为类似于4294967291.我可以看到程序正在将数据转换为接近无符号数据类型的最大值(在numeric_limits标头中定义)的值,但我的问题是为什么,因为{{ 1}}语句应该停在if
?
我的代码:
sstream >> value
感谢您的时间!
答案 0 :(得分:2)
在涉及具有 n 值位的unsigned
类型的C ++算法中,保证模2 ^ n 。这意味着通过添加或减去2 ^ n 的合适倍数,任何结果都会回绕到0到2 ^ n -1的范围内。在C中也是如此。
因此,您需要检查减号的输入,或添加其他检查。
顺便说一句,if
>>
和&&
对我的坏码表产生了一些影响。我永远不会记住>>
与&&
的运算符优先级。我想如果编译它一定是好的,因为>>
不能取右边的值。检查......好的,但是我会用括号来澄清这一点。
此外,在代码结构上,将交互式输入事物与输入检查分开是个好主意。例如,你可以使用编辑字段的输入在GUI程序中使用任何代码吗?不,不是因为......
干杯&第h。,
答案 1 :(得分:1)
Alf已经回答了这个问题,但我还有其他一些想法。 从try块中提取输入的代码。您没有捕获它可能引发的任何异常,因此它也不会传达意图。 try块应该在if(input.empty())之前开始... 然后将try块中的所有内容拉入单个验证函数。这清理了这里的代码。但是,要在GUI中使用,您需要创建一个只需获取输入而无需验证的函数,并公开验证函数。然后,用户可以根据需要处理验证异常。虽然在这种情况下,我没有看到使用异常而不是简单的错误代码进行验证的优势。
希望这有帮助,