#c
#c
Вопрос:
В настоящее время я работаю над назначением и пытаюсь использовать обработку ошибок try catch для проверки того, что ввод пользователя является допустимым int.
В настоящее время у меня есть это:
int inputValidation() {
int e = 0;
std::string es;
bool check = false;
do {
try {
if (!getline(std::cin, e)) {
throw stringInput;
}
else {
check = true;
}
}
catch (std::exceptionamp; er) {
std::cout << "Error! " << er.what() << std::endl;
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
}
} while (!check);
return e;
}
моя проблема связана с if ((getline(std::cin, e))){}
частью. Я также пытался использовать std::cin.getline(e, 256)
При вызове функции я использую этот цикл:
do {
std::cout << "Please select a month: ";
selectedMonth = inputValidation();
} while (selectedMonth < 1 || selectedMonth >(12 - actualMonth));
Это просто гарантирует, что они могут вводить только месяц с текущего месяца до декабря.
Я знаю, что могу использовать es
вместо e
, однако это противоречит цели проверки ошибок. Моя единственная идея, вытекающая из этого, — проверить преобразование.
По какой-то причине я, похоже, получаю сообщение об ошибке «нет экземпляра перегруженной функции «getline»» и не уверен, где я ошибаюсь. Если бы кто-нибудь мог дать некоторое представление, я был бы очень благодарен.
Комментарии:
1. Вы исправляете это, используя правильные параметры, getline всегда принимает строку , а не int.
2. Что не так с
std::cin >> e;
?3. @Borgleader Спасибо 🙂 Есть ли способ использовать этот ввод перед инструкцией if, а затем проверить преобразование? Еще раз спасибо
4. @mch Я изо всех сил пытался очистить буфер и обнаружил, что цикл никогда не прервется, несмотря на то, что входные данные действительны :/
5. @mch Я думаю, что это была проблема с моим циклом — мой плохой
Ответ №1:
если std::cin >> e
это не подходит, вы могли бы использовать istringstream
:
std::string asText;
std::getline(cin,asText);
std::istringstream iss (asText);
if (iss >> e)
Комментарии:
1. Спасибо за сообщение, Джаспер! Я буквально только что исправил это, а затем увидел ваш ответ :/
Ответ №2:
Первая версия
Мне удалось исправить это, изменив его на:
int inputValidation(std::string message) {
int e = NULL;
std::string es;
bool check = false;
do {
try {
std::cout << message;
getline(std::cin, es);
if (!atoi(es.c_str())) {
throw stringInput;
}
else {
e = atoi(es.c_str());
check = true;
}
}
catch (std::exceptionamp; er) {
std::cout << "Error! " << er.what() << std::endl;
}
} while (!check);
return e;
}
//In another function -->
do {
selectedMonth = inputValidation("Please select a month: ");
} while (selectedMonth < 1 || selectedMonth >(12 - actualMonth));
Рабочая версия
Начиная с комментариев, я изменил это.
(Единственное отличие в том, что эта версия не включает исключение)
bool checkInput(int amp;input, std::string message) {
try {
std::cin >> input;
if (!std::cin.fail()) {
return true;
}
else {
throw(message);
}
}
catch (std::string e) {
std::cout << "Invalid input!" << std::endl;
std::cout << e << std::endl;
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
return false;
}
}
//Elsewhere -->
std::cout << "Please input the lowest number you would like to check" << std::endl;
while (!checkInput(lowestNumber, "Please input the lowest number you would like to check"));
Комментарии:
1. Это не сработает. atoi() возвращает преобразованный int, а не bool, указывающий на успех. Это будет указывать на сбой, только если проанализированное значение int равно 0. Чтение строки, не подлежащей анализу, приводит к неопределенному поведению. Используйте istringstream или strtol. cplusplus.com/reference/cstdlib/atoi
2. @JasperKent Я понимаю, что вы имеете в виду.. Однако по какой-то причине у меня это работает, и назначение должно быть выполнено завтра. Я не хочу ничего менять, если не знаю, что я опережаю время tbh. Я не пытаюсь звучать здесь как a * *, просто у меня нехватка времени. Я не буду проверять это после отправки, потому что я пытаюсь улучшить работу с C . Спасибо за ваш ответ 🙂
3. Может показаться, что это работает, но поверьте мне — это не так.
4. Хорошо, я изменю его на вашу версию — спасибо за помощь 🙂
5. Я просто изменил его, и теперь оператор if выполняется каждый раз, несмотря на получение допустимого ввода. std::string asText; getline(std::cin, asText); std::istringstream iss(asText); if (!iss >> e) { throw stringInput; }