барахло осталось в буфере cin

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

код меню

void menu() { bool done = false; string input; while(!done) { cout << "Welcome to the DVD database." << endl; cout << "1. Add A DVD" << endl; cout << "2. Delete a DVD." << endl; cout << "3. Edit a DVD." << endl; cout << "4. List By Category." << endl; cout << "5. Retrieve by a DVD by Title." << endl; cout << "6. Display collection by year" << endl; cout << "7. Display collection by title" << endl; cout << "-999. Exit program" << endl; cout << "Please choose an option by entering the corresponding number" <> input; int value = atoi(input.c_str()); switch(value) { case 1:addDVD(); break; case 2:deleteDVD(); break; // case 3:editDVD(); break; case 4:listByCategory();break; case 6:displayByYear();break; case 7:displayByTitle();break; case -999: writeToFile(); exit(0); break; default : cout <<"Invalid entry"<< endl; break; } } } void retrieveByTitle() { string search; int size = database.size(); int index = 0; bool found = false; cin.ignore(); cout << "Please enter the title of the DVD you would like to retrieve: " << endl; getline(cin,search); cout << search; while(!found && indexgetTitle().compare(search)==0) { cout <toString(); break; } } cout << endl; } 

если в меню введено 5, программа пропускает пользовательский ввод в методе

Этот код работает, но он имеет ту же проблему, которую вы описываете, если вы исключили « cin.ignore () », который удаляет лишние разделители, игнорируемые оператором cin >>:

 #include  #include  using namespace std; int main() { string a, b; while (true) { cout << "write 'x' to exit: " << endl; cin >> a; if (a == "x") { break; } cout << "read '" << a << "'" << endl; cout << "now write a line: " << endl; cin.clear(); // clears cin status cin.ignore(INT_MAX); // clears existing, unprocessed input getline(cin, a); cout << "read '" << a << "'" << endl; } return 0; } 

При работе с интерактивным пользовательским вводом вы должны использовать std :: getline ()

Std :: cin сбрасывается в приложение каждый раз, когда вы нажимаете . Итак, это логические джонки, которые вы должны прочитать от пользователя.

 std::string answer; std::cout << "Question:\n"; std::getline(std::cin, answer); 

Это дает вам все, что пользователь предоставил в ответ на предыдущий вопрос.

Когда у вас есть вход, вы должны получить значение, которое, по вашему мнению, находится на входе. После этого вы должны проверить, есть ли какой-либо другой хлам на входе (если есть прервать и повторить попытку), в противном случае подтвердите данные, которые вы ожидали.

Если бы вас ожидали целое число;

 std::stringstream linestream(answer); int value; std::string junk; if ((answer >> value)) && (!(answer >> junk))) { // If you got data // and there was no junk on the line you are now good to go } 

В вашем конкретном примере уже есть простой способ сделать это:

 std::getline(std::cin, input); int value = boost::lexical_cast(input); // throws an exception if there is not // an int on the input (with no junk)