2013-09-02 8 views
5

Новое на C++. Имеет проблемы с правильным циклом при обработке ошибок. Я пытаюсь проверить, является ли пользовательский ввод целым, и является положительным.C++ Проверка целого числа.

do{ 
    cout << "Please enter an integer."; 
    cin >> n; 

    if (cin.good()) 
    { 
     if (n < 0) {cout << "Negative.";} 
     else {cout << "Positive.";} 
    } 
    else 
    { 
     cout << "Not an integer."; 
     cin.clear(); 
     cin.ignore(); 
    } 
}while (!cin.good() || n < 0); 

cout << "\ndone."; 

Когда вводится нецелое число, цикл прерывается. Я чувствую, что я не понимаю, как использовать cin.clear() и cin.ignore() и статус cin во время этого цикла. Если я удалю cin.ignore(), цикл станет бесконечным. Почему это? Что я могу сделать, чтобы сделать это в элегантно функционирующий цикл? Спасибо.

+1

Используйте отладчик. –

ответ

5

В вашей нецелой ветке вы вызываете дополнительные методы cin, поэтому cin.good() получает значение true.

Вы можете изменить свой код, чтобы что-то вроде этого:

while(1) { // <<< loop "forever" 
    cout << "Please enter an integer."; 
    cin >> n; 

    if (cin.good()) 
    { 
     if (n < 0) {cout << "Negative.";} 
     else { cout << "Positive."; break; } 
    }       // ^^^^^ break out of loop only if valid +ve integer 
    else 
    { 
     cout << "Not an integer."; 
     cin.clear(); 
     cin.ignore(INT_MAX, '\n'); // NB: preferred method for flushing cin 
    } 
} 

cout << "\ndone."; 

или вы можете упростить его еще больше, как это:

while (!(cin >> n) || n < 0) // <<< note use of "short circuit" logical operation here 
{ 
    cout << "Bad input - try again: "; 
    cin.clear(); 
    cin.ignore(INT_MAX, '\n'); // NB: preferred method for flushing cin 
} 

cout << "\ndone."; 
+1

Это работает фантастически, спасибо! Я даже не думал, что мой выбор петли задерживает меня. Я ценю помощь и объяснение. – xavi

+0

Не приведет ли вторая версия к бесконечному циклу после того, как пользователь введет мусор (т. Е. Что-то вроде «abc»)? Вам нужно извлечь (или игнорировать) мусор перед циклом (но после 'clear()'). –

+0

@James: good catch - thanks - я исправил его сейчас (и на самом деле протестировал его!). –

3
int n; 

while (!(cin >> n)||n<0)//as long as the number entered is not an int or negative, keep checking 
{ 
cout << "Wrong input. Please, try again: "; 
cin.clear();//clear input buffer 

} 
//only gets executed when you've broken out of the while loop, so n must be an int 
cout << "Positive."; 

cout << "\ndone.";//finished! 

Должен делать то, что вы хотите.

+0

, который не объясняет, что произошло ... –

+0

@NoIdeaForName, я буду комментировать объяснения – imulsion

+0

теперь, когда я его изучаю, он даже не делает того, что он просил сделать. если вход хороший, вы должны уйти, только если он отрицательный ... –

Смежные вопросы