У меня аналогичная проблема, но я не совсем уверен, что вы делаете с getline
и junk
?
Вот что я поставил, я могу понять, почему он ничего не сделает, если вы не вводите дважды после ввода символа или специального символа, но как я могу сделать так, чтобы он продолжался только на действительном вводе?
Моя цель состоит в том, чтобы заставить консоль писать недопустимую запись, когда вводится буква, специальный символ, двойной (десятичный знак) или ничего, и продолжаются только в действительной записи.
Я попытался с помощью if ((programSelect > 0) && (programSelect <=4))
, но если на входе пользователя 4.5 она будет работать программу 4, а затем сказать недопустимую запись:/
do
{
cout << "Please select a program to run: ";
cin >> programSelect;
if (cin >> programSelect)
{
invalid = false;
break;
}
else if (cin.bad())
{
cin.clear();
cin.ignore(INT_MAX, '\n');
invalid = true;
cout << "Invalid entry.\n";
}
else if (cin.eof())
{
cin.clear();
cin.ignore(INT_MAX, '\n');
invalid = true;
cout << "Invalid entry.\n";
}
else
{
cin.clear();
cin.ignore(INT_MAX, '\n');
invalid = true;
cout << "Invalid entry.\n";
}
} while (invalid == true);
switch (programSelect)
{
case 1:
addItems();
repeat = true;
break;
case 2:
bodyReview();
repeat = true;
break;
case 3:
reviewAll();
repeat = true;
break;
case 4:
repeat = false;
break;
default:
repeat = true;
break;
}
Так что я придумал, как сделать эту проблему работу очень хорошо. Он запрещает пользователю вводить символы, специальные символы или десятичные знаки. Если вы можете подумать о более эффективном способе выполнения этой же задачи, дайте мне знать, это использует еще пару строк и переменных, чем хотелось бы, но выполняет требуемую задачу.
double userInput, inDec;
int programSelect, decTest;
bool invalid(true);
do
{
cout << "Please select a program to run: ";
cin >> userInput;
decTest = userInput;
inDec = userInput - decTest;
programSelect = userInput - inDec;
if ((inDec > 0) || (inDec < 0))
{
cin.clear();
cin.ignore(INT_MAX, '\n');
invalid = true;
cout << "Invalid entry.\n";
}
else if (!cin)
{
cin.clear();
cin.ignore(INT_MAX, '\n');
invalid = true;
cout << "Invalid entry.\n";
}
else if ((programSelect > 0) && (programSelect <= 4))
{
invalid = false;
break;
}
else
{
cin.clear();
cin.ignore(INT_MAX, '\n');
invalid = true;
cout << "Invalid entry.\n";
}
} while (invalid == true);
Это использует двойной для ввода данных пользователя, чтобы обнаружить, если они вводят десятичный или нет, и возвращает Invalid ошибки ввода, если они делают, а также позволяет избежать бесконечного цикла COUT, если пользователь вводит символ или специальный символ.
Спасибо .. это исправлено .. Я чувствую себя немым сейчас. –
@Melissagoodall: Ты новичок в этом. Получение порядка запроса ввода и проверки правильности может быть действительно запутанным (даже для более опытных разработчиков) – AndyG