Проверка пользовательского ввода с помощью cin - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь сделать это: если значение больше 50 или меньше -50, или не целое, то снова значение cin (до тех пор, пока оно не станет действительным)

for (size_t i = 0; i < cities; i++)
{
    for (size_t j = 0; j < days; j++)
    {
        cout << "temperature(" << i + 1 << ',' << j + 1 << ") = ";
        cin >> *(temperatures + i * days + j);
        while (!(*(temperatures + i * days + j) > 50 && *(temperatures + i * days + j) < -50))
        {
            cin.clear();
            cin.ignore();
            cout << "temperature(" << i + 1 << ',' << j + 1 << ") = ";
            cin >> *(temperatures + i * days + j);
        }
    }

если я напишу число больше 50 или меньше -50, это работает.

Но если я напишу, например:

temperature(1,1) = covid

, чем следующая строка:

temperature(1,1) = temperature(1,1) = temperature(1,1) = temperature(1,1) = temperature(1,1) = 

Как я могу это исправить?

1 Ответ

1 голос
/ 26 мая 2020

Проблема в том, что вы тестируете значение *(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), даже если на входе есть нецифры. Если вы хотите правильно выполнить проверку ввода, тогда единственный реальный способ - прочитать ввод как строку и проверить строку перед преобразованием в целое число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...