У меня есть система создания меню с вектором строк, из которого пользователь может выбрать, и в качестве таковых допустимы только целые числа, которые находятся в опциях меню.
Если число введено правильно,все отлично работаетЕсли введен неправильный ввод (строка, число с плавающей запятой, отрицательное число и т. Д.), Ничего не произойдет, если предполагается отобразить сообщение об ошибке.
Если предпринята попытка ввести что-либо еще (допустимо илинет), сообщение об ошибке будет появляться для каждой последующей записи, и пользователь застревает.
Это цикл, который я использую для проверки кода -
bool check = false;
string line;
std::stringstream temp;
int input;
while(!check)
{
getline(cin, line);
temp << line;
temp >> std::noskipws >> input; //this is supposed to reject spaces and floats
if(!temp.fail() && temp.eof() && input > 0 && input <= static_cast<int>(options.size()))
{
check = true; //returns valid value and stops loop
}
else //if all conditions aren't met
{
cin.clear();
cin.ignore();
cout << wrongInput << endl; //prints error
}
}
return input; //correctly returns when valid on first try
Перед этим,Я просто использовал cin >> input и cin.fail () для проверки, но это позволило проходить числам с плавающей точкой и отображать сообщение об ошибке несколько раз для строковых записей.
Если есть какая-либо пропущенная информация, пожалуйста, дайте мне знать,но я думаю, что здесь все, что имеет значение.
РЕДАКТИРОВАТЬ: просто тестировал мою программу с только правильными вводами, и она, казалось бы, начала произвольно давать сбой.
Пример неправильного ввода:
(menu with numbered options)
intput: "abba" || "3.2" || "4 3" || "-4" || etc.
(no response)
input: "valid number"
(please enter a number from above) - repeats indefinitely
Пример правильного ввода:
(menu with numbered options)
input: "1"
(correctly executes "1" selection, shows menu again)
input: "1"
(again correctly executes "1" selection, shows menu again)
input: "1"
(no response)
input: "1"
(please enter a number from above) - repeats indefinitely