Хороший цикл проверки ввода с использованием 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());