良好的inputvalidation循环使用cin – C ++
我在我的第二个OOP类中,我的第一堂课是用C#教的,所以我是C ++新手,目前正在使用cin练习inputvalidation。 所以这是我的问题:
这个循环是否构build了validationinput的一个很好的方法? 还是有一个更普遍的/被接受的方式呢?
谢谢!
码:
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);
我不是打开iostreams例外的巨大风扇。 I / O错误并不十分出色,因为错误通常很可能。 我只喜欢使用不常见的错误条件的例外。
代码不错,但跳过80个字符是有点随意的,如果你摆弄循环(如果你保持它,应该是bool
),错误variables是不必要的。 你可以把读取的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个字符,这些只是小小的狡辩,更多的是喜欢的风格。
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; }
所以你看我使用stringinput,然后将其转换为一个整数。 这样,有人可以键入input,“米老鼠”或任何东西,它仍然会回应。
另外#include <string>
和<sstream>
可能你不考虑try / catch,只是为了让你习惯于exception处理的概念?
如果没有,为什么不使用布尔值而不是0和1? 养成使用正确types的variables的习惯(并在需要的地方创buildtypes)
Cin.fail()也在http://www.cplusplus.com/forum/beginner/2957/上讨论;
其实在很多地方
你可能会研究其中的一些,试图按照某种方式来解释为什么应该这样做。
但是,迟早你应该明白例外。
一个小问题是,错误帮助variables是完全多余的,不需要:
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());