良好的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/上讨论;

其实在很多地方

http://www.google.com.sg/#hl=en&source=hp&q=c%2B%2B+tutorial&btnG=Google+Search&meta=&aq=f&oq=c%2B%2B+tutorial

你可能会研究其中的一些,试图按照某种方式来解释为什么应该这样做。

但是,迟早你应该明白例外。

一个小问题是,错误帮助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());