Cin проверяет ввод только чисел в диапазоне от 0 до 255

cin >> red_rgb;

Как проверить переменную red_rgb, green_rgb, blue_rgb при вводе в нее, чтобы допускались только значения в диапазоне от 0 до 255, при этом учитывались только целые {0,1,2...254,255}, иначе вам понадобится чтобы ввести правильное значение.

int red_rgb = 0;
int green_rgb = 0;
int blue_rgb = 0;    

std::cout << "Enter R: ";
        while (!(cin >> red_rgb) || !(red_rgb >= 0 && red_rgb <= 255))
        {
            cout << "Error";
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
        }
        std::cout << "Enter G: ";
        while (!(cin >> green_rgb) || !(green_rgb >= 0 && green_rgb <= 255))
        {
            cout << "Error";
            cin.clear(); 
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            
        }
        std::cout << "Enter B: ";
        while (!(cin >> blue_rgb) || !(blue_rgb >= 0 && blue_rgb <= 255))
        {
            cout << "Error";
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
        }

Этот метод проверяет диапазон, но пропускает точку с запятой. А если вместо цифр вводить буквы, то чем больше букв, тем больше раз будет запускаться цикл.

если вы вводите число с плавающей запятой, цикл ввода следующего значения пропускается введите здесь описание изображения

По умолчанию ignore() игнорирует только один символ, но вы можете передать большее число в качестве параметра.

BoP 11.10.2022 14:00
std::cin.ignore(std::numeric_limits<std::streamsize>::max(),‌​'\n');
Eljay 11.10.2022 14:09

Да, я исправил эту проблему с cin.ignore(), но такие значения, как 4,5, 3f, 0,01, работают. Нужно проверить эту переменную на целое число.

BLazzeD21 11.10.2022 14:26

red_rgb и тому подобное типа int?

Bob__ 11.10.2022 15:06

Да, int red_rgb;

BLazzeD21 11.10.2022 15:11

Здесь много обманов о проверке целочисленного ввода в C++, суть в том, что вам лучше ввести строку, а затем проанализировать ее (используя std::stoi , std::strtol или std::from_chars ), проверяя, что все символы используются.

Bob__ 11.10.2022 18:28
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте что-то вроде этого:

int inprgb(const string& hint){
    int a=-1;
    while (true){
      cout << hint;
      cin>>a;
      if (cin.fail() || cin.peek()!=10 ||!(a >= 0 && a <= 255) ) {
          cin.clear();
          cout << "Error\n";
          cin.ignore(numeric_limits<streamsize>::max(), '\n');
          continue;
      }
      break;
    }
    return  a;
};

и

red_rgb = inprgb("Enter R: ");

Другие вопросы по теме

Функция неправильно увеличивает переменную на 1
Почему в С++ (и в большинстве других языков) есть циклы for и while?/Что можно сделать с одним типом, чего нельзя сделать с другим?
Мне трудно преобразовать эту логику do while в цикл while. Какая логика скрыть это?
Как интерпретировать конъюнкцию как условие цикла?
Как закрыть этот файл, чтобы переименовать и удалить файл ("Поток закрыт")
Мне нужно разъяснение условного оператора цикла Java while при попытке найти самый длинный общий префикс из массива строк
Как заставить цикл while продолжать цикл, если определенные параметры не выполняются?
В цикле while, как вы храните данные, чтобы, когда цикл заканчивается, он выводил все введенные данные, а не просто сбрасывал в следующем цикле while
Почему замена содержимого файла в ArrayList возвращает нежелательные результаты?
Как сделать повторяющийся список списков с помощью цикла while