почему остальные мои функции повторяют один и тот же код и заканчиваются sh?
Это потому, что когда извлечение int
завершается неудачно, символ, делающий извлечение неудачным остается в потоке (и будет встречаться каждый раз при попытке нового извлечения), и поток переводится в состояние сбоя, что делает любые дальнейшие попытки извлечения данных из потока неуспешными - поэтому любые значения, которые вы ранее установили для num1
и num2
будут использоваться снова и снова. Если значение не было присвоено, вы читаете неинициализированную память, и ваша программа имеет неопределенное поведение.
Для восстановления после неудачного извлечения вы можете clear()
флаги состояния потока и ignore()
символы в потоке до конца line.
Кроме того, ваша функция request()
и остальные функции в любом случае имеют неопределенное поведение. Они объявили, что они возвращают int
, но ничего не возвращают, поэтому вместо этого сделайте их void
.
Однако вы можете изменить request()
, чтобы получить bool
. Верните true
, если запрос был успешно выполнен, и false
в противном случае:
#include <limits> // std::numeric_limits
bool request() {
cout << "Type in a number: ";
if(cin >> num1) {
cout << "Type in a number: ";
if(cin >> num2) return true; // both numbers extracted successfully
}
// something failed
if(not cin.eof()) { // skip clearing the state if eof() is the reason for the failure
cin.clear(); // clear the fail state
// ignore rest of line to remove the erroneous input from the stream
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
return false;
}
Теперь вы можете использовать его и убедиться, что пользователь действительно успешно ввел два значения. Пример:
void getMin() { // made it void since it doesn't return anything
cout << "Get the minimum of 2 numbers" << endl;
if(request()) { // check that extraction succeeded
if(num1 < num2)
cout << "The minimumm of " << num1 << " and "
<< num2 << " is " << num1 << endl;
else
cout << "The minimumm of " << num1 << " and "
<< num2 << " is " << num2 << endl;
}
}