Хороший цикл проверки ввода с использованием cin - С++
Я нахожусь в моем втором классе ООП, и мой первый класс преподавался на С#, поэтому я новичок в С++, и в настоящее время я практикую проверку ввода с использованием 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);
Ответы
Ответ 1
Я не большой поклонник включения исключений для iostreams. Ошибки ввода-вывода не являются достаточно исключительными, поскольку ошибки часто бывают весьма вероятными. Я предпочитаю использовать исключения для менее частых ошибок.
Код не плох, но пропустить 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 символов, это лишь незначительные каламбуры, и это скорее вопрос предпочтительного стиля.
Ответ 2
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>
Ответ 3
Можете ли вы не считать try/catch, просто чтобы вы привыкли к концепции обработки исключений?
Если нет, почему бы не использовать логическое, а не 0 и 1? Входите в привычку использовать переменные правильного типа (и создания типов там, где это необходимо)
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
вы можете изучить некоторые из них и попытаться следовать объяснениям, почему все должно быть сделано определенным образом.
Но, рано или поздно, вы должны понимать исключения...
Ответ 4
Один незначительный вопрос заключается в том, что переменная-хелпер-ошибка полностью избыточна и не нужна:
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());