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');
}
Этот метод проверяет диапазон, но пропускает точку с запятой. А если вместо цифр вводить буквы, то чем больше букв, тем больше раз будет запускаться цикл.
если вы вводите число с плавающей запятой, цикл ввода следующего значения пропускается введите здесь описание изображения
std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
Да, я исправил эту проблему с cin.ignore()
, но такие значения, как 4,5, 3f, 0,01, работают. Нужно проверить эту переменную на целое число.
red_rgb
и тому подобное типа int
?
Да, int red_rgb;
Здесь много обманов о проверке целочисленного ввода в C++, суть в том, что вам лучше ввести строку, а затем проанализировать ее (используя std::stoi , std::strtol или std::from_chars ), проверяя, что все символы используются.
Попробуйте что-то вроде этого:
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: ");
По умолчанию
ignore()
игнорирует только один символ, но вы можете передать большее число в качестве параметра.