将字符串类型转换为unsigned int失败

时间:2010-11-11 04:23:13

标签: c++ validation casting

我遇到了一个烦人的问题,我写的是C ++函数,其目的是验证用户输入。该函数读取用户输入,验证它是否为数字,如果是,则验证它是否在[min,max]范围内。

当我使用无符号类型调用模板函数(例如size_t)并且输入为负数时,会出现问题。字符串流将字符串转换为类似于4294967291.我可以看到程序正在将数据转换为接近无符号数据类型的最大值(在numeric_limits标头中定义)的值,但我的问题是为什么,因为{{ 1}}语句应该停在if

我的代码:

sstream >> value

感谢您的时间!

2 个答案:

答案 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中使用,您需要创建一个只需获取输入而无需验证的函数,并公开验证函数。然后,用户可以根据需要处理验证异常。虽然在这种情况下,我没有看到使用异常而不是简单的错误代码进行验证的优势。

希望这有帮助,