C++11(即使用 C++11 技术)验证 cin 输入的最佳方法是什么?我已经阅读了很多其他答案(都涉及 cin.ignore、cin.clear 等),但这些方法看起来很笨拙,并导致大量重复代码。
编辑:通过“验证”,我的意思是既提供了格式良好的输入,又满足了一些特定于上下文的谓词。
C++11(即使用 C++11 技术)验证 cin 输入的最佳方法是什么?我已经阅读了很多其他答案(都涉及 cin.ignore、cin.clear 等),但这些方法看起来很笨拙,并导致大量重复代码。
编辑:通过“验证”,我的意思是既提供了格式良好的输入,又满足了一些特定于上下文的谓词。
我正在发布我对解决方案的尝试作为答案,希望它对其他人有用。不必指定谓词,在这种情况下,该函数将仅检查格式正确的输入。我当然愿意接受建议。
//Could use boost's lexical_cast, but that throws an exception on error,
//rather than taking a reference and returning false.
template<class T>
bool lexical_cast(T& result, const std::string &str) {
std::stringstream s(str);
return (s >> result && s.rdbuf()->in_avail() == 0);
}
template<class T, class U>
T promptValidated(const std::string &message, std::function<bool(U)> condition = [](...) { return true; })
{
T input;
std::string buf;
while (!(std::cout << message, std::getline(std::cin, buf) && lexical_cast<T>(input, buf) && condition(input))) {
if(std::cin.eof())
throw std::runtime_error("End of file reached!");
}
return input;
}
这是它的用法示例:
int main(int argc, char *argv[])
{
double num = promptValidated<double, double>("Enter any number: ");
cout << "The number is " << num << endl << endl;
int odd = promptValidated<int, int>("Enter an odd number: ", [](int i) { return i % 2 == 1; });
cout << "The odd number is " << odd << endl << endl;
return 0;
}
如果有更好的方法,我愿意接受建议!
如果通过验证你的意思是当你想要一个int
你想知道一个int
是否真的输入时,那么只需将输入置于一个if
条件中:
int num;
while (!(std::cin >> num))
{
std::cout << "Whatever you entered, it wasn't an integer\n";
}
std::cout << "You entered the integer " << num << '\n';