用 C++ 验证用户输入
本文将演示关于如何在 C++ 中验证用户输入的多种方法。
使用 cin
与 cin.clear
和 cin.ignore
方法来验证用户输入
这个例子的重点是一个健壮的用户输入验证方法,这意味着它应该满足基本的错误检查要求,即使输入的类型是错误的,也要继续执行。
实现这个功能的第一个构造是 while
循环,我们要在一个条件中指定 true
。这个迭代将保证循环行为,直到正确的值被存储在一个变量中。在循环内部,一个 if
语句会评估 cin >> var
表达式,因为插入操作成功后,返回值为正。一旦正确地存储了值,我们就可以退出循环;否则,如果 cin
表达式没有成功,执行就会进入 cin.clear
调用,在意外输入后取消设置 failbit
。接下来,我们跳过输入缓冲区中剩余的字符,进入下一次迭代询问用户。
#include <iostream>
#include <sstream>
#include <limits>
#include <vector>
using std::string; using std::vector;
using std::cout; using std::endl;
using std::cin; using std::numeric_limits;
int main()
{
int age;
while (true) {
cout << "Enter the age of the wine: ";
if (cin >> age) {
break;
} else {
cout << "Enter a valid integer value!\n";
cin.clear();
cin.ignore(numeric_limits<std::streamsize>::max(), '\n');
}
}
return EXIT_SUCCESS;
}
输出:
Enter the age of the wine: 32
使用自定义函数来验证用户的输入
以前的方法即使对于几个输入变量也是相当麻烦的,而且多个 while
循环会浪费代码空间。因此,应将子程序概括为一个函数。validateInput
是函数模板,它接收变量的引用并返回成功存储的值。
注意,即使我们需要实现一个 100 道题的测验,这个方法也能保证比之前的版本产生的代码干净得多。
#include <iostream>
#include <sstream>
#include <limits>
#include <vector>
using std::string; using std::vector;
using std::cout; using std::endl;
using std::cin; using std::numeric_limits;
template<typename T>
T &validateInput(T &val)
{
while (true) {
cout << "Enter the age of the wine: ";
if (cin >> val) {
break;
} else {
cout << "Enter a valid integer value!\n";
cin.clear();
cin.ignore(numeric_limits<std::streamsize>::max(), '\n');
}
}
return val;
}
int main()
{
int age;
int volume;
int price;
age = validateInput(age);
volume = validateInput(volume);
price = validateInput(price);
cout << "\nYour order's in!\n" << age << " years old Cabernet"
<< " in " << volume << "ml bottle\nPrice: " << price << "$\n";
return EXIT_SUCCESS;
}
输出:
Enter the age of the wine: 13
Enter the volume of the wine in milliliters: 450
Enter the price of the bottle: 149
Your order's in!
13 years old Cabernet in 450ml bottle
Price: 149$
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn