2009-08-16 3 views
4

У меня возникли проблемы с некоторыми областями ввода моей программы. Есть несколько частей, где пользователь вводит определенное целое число. Даже если они введут неправильный, все это прекрасно и денди, но я заметил, что если они вводят что-либо не целочисленного типа типа «m», тогда он будет зацикливать сообщение об ошибке повторно.Пользовательский ввод целых чисел - обработка ошибок

У меня есть пара функций, которые имеют в них целочисленный ввод. Вот пример.

void Room::move(vector<Room>& v, int exone, int extwo, int exthree, int current) 
{ 
    v[current].is_occupied = false; 
    int room_choice; 
    cout << "\nEnter room to move to: "; 
    while(true) 
    { 
     cin >> room_choice; 
     if(room_choice == exone || room_choice == extwo || room_choice == exthree) 
     { 
      v[room_choice].is_occupied = true; 
      break; 
     } 
     else cout << "Incorrect entry. Try again: "; 
    } 
} 

[РЕШИТЬ]

void Room::move(vector<Room>& v, int exone, int extwo, int exthree, int current) 
{ 
    v[current].is_occupied = false; 
    int room_choice; 
    cout << "\nEnter room to move to: "; 
    while(true) 
    { 
     cin >> room_choice; 
     if(room_choice == exone || room_choice == extwo || room_choice == exthree) 
     { 
      v[room_choice].is_occupied = true; 
      break; 
     } 
     else if(cin.fail()) 
     { 
      cin.clear() 
      cin.ignore() 
      cout << "Incorrect entry. Try again: "; 
     } 
    } 
} 
+3

Aaarrgh !!! Почему профессора продолжают назначать эти глупые упражнения ввода-вывода в консоль? –

ответ

6

Вы можете использовать cin.good() или cin.fail(), чтобы определить, может ли CIN успешно справиться с входным значением при условии. Затем вы можете использовать cin.clear(), чтобы очистить состояние ошибки до продолжения обработки.

+0

Да, я попробовал использовать cin.clear(), чтобы очистить буфер, но ничего не изменил. Однако я попробую ваши другие предложения. – trikker

+0

Проверка cin.fail() и использование cin.ignore() и cin.clear() исправленных вещей. Благодарю. – trikker

+0

cin.sync() тоже может быть полезным ... он удалит все недочетные символы –

9

В вашем «разрешенном» коде все еще есть проблема. Перед проверкой значений проверьте проверку fail(). (И, очевидно, проблема с ошибками eof() и IO в отличие от проблем с форматом).

Идиоматическое чтение

if (cin >> choice) { 
    // read succeeded 
} else if (cin.bad()) { 
    // IO error 
} else if (cin.eof()) { 
    // EOF reached (perhaps combined with a format problem) 
} else { 
    // format problem 
} 
+1

Это абсолютно правильный способ сделать это. –

+0

Но независимо от того, сколько раз это указано, люди настаивают на том, чтобы делать это неправильно. Я как бы отказался от этого :-( – 2009-08-16 13:45:06

+0

Спасибо AProgrammer. – trikker

1

Для еще более простого способа, вы можете использовать ! оператор вроде этого:

 if (!(cin >> room_choice)) 
     { 
      cin.clear(); 
      cin.ignore(); 
      cout << "Incorrect entry. Try again: "; 
     } 
Смежные вопросы