我正处于我的第二个OOP课程中,我的第一堂课是用C#教授的,所以我是C ++的新手,目前我正在使用cin练习输入验证。所以这是我的问题:
这个循环是否构建了一种验证输入的好方法?或者有更常见/可接受的方式吗?
谢谢!
代码:
int taxableIncome;
int error;
// input validation loop
do
{
error = 0;
cout << "Please enter in your taxable income: ";
cin >> taxableIncome;
if (cin.fail())
{
cout << "Please enter a valid integer" << endl;
error = 1;
cin.clear();
cin.ignore(80, '\n');
}
}while(error == 1);
答案 0 :(得分:29)
我不喜欢为iostream打开异常。 I / O错误不够特别,因为错误通常很可能。我更喜欢在不常见的错误条件下使用异常。
代码也不错,但跳过80个字符有点随意,如果你操纵循环则不需要错误变量(如果你保留它就应该是bool
)。您可以将cin
的读取直接放入if
,这可能更像是Perl习语。
这是我的看法:
int taxableIncome;
for (;;) {
cout << "Please enter in your taxable income: ";
if (cin >> taxableIncome) {
break;
} else {
cout << "Please enter a valid integer" << endl;
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
}
除了只跳过80个字符外,这些只是轻微的狡辩,而且更像是首选的风格。
答案 1 :(得分:5)
int taxableIncome;
string strInput = "";
cout << "Please enter in your taxable income:\n";
while (true)
{
getline(cin, strInput);
// This code converts from string to number safely.
stringstream myStream(strInput);
if ( (myStream >> taxableIncome) )
break;
cout << "Invalid input, please try again" << endl;
}
所以你看到我使用字符串输入然后将其转换为整数。这样,有人可以键入enter,'mickey mouse'或者其他任何东西,它仍会响应
另外#include <string>
和<sstream>
答案 2 :(得分:2)
你可能不会考虑尝试/捕获,只是为了让你习惯于异常处理的概念?
如果没有,为什么不使用布尔值而不是0和1?养成使用正确类型的变量(以及在需要时创建类型)的习惯
Cin.fail()也在http://www.cplusplus.com/forum/beginner/2957/
进行了讨论事实上,在很多地方......
你可能会研究其中的一些,并尝试按照解释为什么应该以某种方式完成事情。
但是,迟早,你应该理解例外......
答案 3 :(得分:2)
一个小问题是错误辅助变量是完全冗余的,不需要:
do
{
cin.clear();
cout << "Please enter in your taxable income: ";
cin >> taxableIncome;
if (cin.fail())
{
cout << "Please enter a valid integer" << endl;
cin.ignore(80, '\n');
}
}while(cin.fail());