2015-11-16 7 views
0

Я пытаюсь поймать неверные входы без tryCatch-Block. Всякий раз, когда пользователь вводит неправильное значение (например, «hh» или -5), моя программа должна запросить еще раз, пока пользователь не установит правильное значение. После этого продолжайте, пока массив не будет заполнен.C++ catch ложный ввод без блока tryCatch

int main() { 
    double array[6]; 
    string str_array[7]; 
    str_array[0] = "stringA"; 
    str_array[1] = "stringB"; 
    str_array[2] = "stringC"; 
    str_array[3] = "StringD"; 
    str_array[4] = "StringE"; 
    str_array[5] = "StringF"; 
    str_array[6] = "StringG"; 
    double value; 

    for (int i = 0; i < 7; i++) { 
    bool exit = false; 
    while (!exit) { 
     cout << str_array[i] << ":"; 
     if (cin >> value&& value> 0) { 
      array[i] = value; 
      cout << array[i] << endl; 
      exit = true; 
     } else { 
      cerr << "incorrect input" << endl; 
      cin.clear(); 
     } 
    } 
    } 
} 
+1

И ваш вопрос? – NathanOliver

+1

Off topic: существует гораздо менее болезненный способ настроить этот строковый массив: 'string str_array [7] = {" stringA "," stringB ", ...}', и вы можете использовать 'std :: vector 'почти так же. – user4581301

+1

Off topic: 'i <7' позволяет' array [i] 'достигать' array [6] ', который выходит за рамки. – user4581301

ответ

1
cin.clear(); 

недостаточно. Кроме того, необходимо потреблять отклоненный вход по синхронизации для нового ввода:

else { 
     cerr << "incorrect input" << endl; 
     cin.clear(); 
     std::string dummy; // <<<<< 
     cin >> dummy; // <<<<< 
    } 

В противном случае вы будете просто читать отвергнут ввод снова и снова.


Нечто подобное cin.ignore(numeric_limits<streamsize>::max(), '\n') может служить вам.

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