Хороший цикл проверки ввода с использованием cin - C ++ - PullRequest
17 голосов
/ 16 января 2010

Я нахожусь во втором классе ООП, и мой первый класс преподавался на 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);

Ответы [ 4 ]

30 голосов
/ 16 января 2010

Я не большой поклонник включения исключений для 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 символов, это всего лишь незначительные придирки, и это скорее вопрос предпочтительного стиля.

5 голосов
/ 14 февраля 2011
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 голосов
/ 16 января 2010

Одна небольшая ошибка в том, что вспомогательная переменная ошибки полностью избыточна и не нужна:

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());
2 голосов
/ 16 января 2010

Не могли бы вы рассмотреть вариант 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

Вы можете изучить некоторые из них и попытаться следовать объяснениям того, почему что-то должно быть сделано определенным образом.

Но рано или поздно вы должны понимать исключения ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...