Проблема в том, что вы тестируете значение *(temperatures + i * days + j)
, даже если ввод не удался. Кроме того, вы неправильно используете игнорирование (игнорирует только один символ вместо всех выдающихся символов). Кроме того, у вас слишком сложный код
Вот лучшая версия
#include <limits> // for std::numeric_limits
cout << "temperature(" << i + 1 << ',' << j + 1 << ") = ";
int temp;
while (!(cin >> temp) || temp < -50 || temp > 50)
{
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "temperature(" << i + 1 << ',' << j + 1 << ") = ";
}
temperatures[i * days + j] = temp;
Я использовал новую переменную temp
, чтобы упростить код. Я включил cin >> temp
в условие while l oop, тем самым проверяя только temp, если ввод был успешным, и я использовал cin.ignore(numeric_limits<streamsize>::max(), '\n');
, чтобы игнорировать все символы, оставшиеся во вводе.
Обратите внимание, что это, вероятно, не идеальный. Если вы ввели, скажем, 10deg
, то ввод будет успешным (temp будет равен 10), даже если на входе есть нецифры. Если вы хотите правильно выполнить проверку ввода, тогда единственный реальный способ - прочитать ввод как строку и проверить строку перед преобразованием в целое число.