我遇到了一个令人讨厌的问题,我写了一个C++函数,其目的是验证用户输入。该函数读取用户输入,验证它是否是数字,如果是,它是否在范围[min,max]中。将字符串错误的类型转换为unsigned int
当我使用无符号类型调用模板函数(如size_t
),并且输入是负数时,会发生此问题。字符串流将字符串转换为类似于4294967291的字符串。我可以看到程序正在将数据转换为接近无符号数据类型的最大值(在numeric_limits标头中定义)的值,但我的问题是为什么,因为if
语句应该停在sstream >> value
?
我的代码:
template <class T>
T getNumberInput(std::string prompt, T min, T max) {
std::string input;
T value;
while (true) {
try {
std::cout << prompt;
std::cin.clear();
std::getline(std::cin, input);
std::stringstream sstream(input);
if (input.empty()) {
throw EmptyInput<std::string>(input);
} else if (sstream >> value && value >= min && value <= max) {
std::cout << std::endl;
return value;
} else {
throw InvalidInput<std::string>(input);
}
} catch (EmptyInput<std::string> & emptyInput) {
std::cout << "O campo não pode ser vazio!\n" << std::endl;
} catch (InvalidInput<std::string> & invalidInput){
std::cout << "Tipo de dados inválido!\n" << std::endl;
}
}
}
谢谢您的时间!
不要传递它一个无符号类型? – Mud 2010-11-11 04:38:38