Как запретить ввод букв?
Программа производит расчет на то, влезет ли параллелепипед в окружность, проблема в том что пользователь за место цифр допустим, может ввести букву и тогда вся программа падает. Нужно сделать защиту от дураков и запретить ввод букв. Подскажите пожалуйста как это можно сделать?
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
setlocale(LC_ALL, "");
float L, D, a, b, c, x, y, z,PI = 3.14;
ret:
cout << "Длина окружности: ";
cin >> D;
cout << "Длина параллелепипеда: ";
cin >> x;
cout << "Ширина параллелепипеда: ";
cin >> y;
cout << "Высота параллелепипеда: ";
cin >> z;
if ((D <= 0) || (x <= 0) || (y <= 0) || (z <= 0)) {
cout << "Введены не коректные данные, введите их заново." << endl;
goto ret;
}
else {
L = D * PI; //Длина окружности
a = sqrt(x * x + y * y);
b = sqrt(x * x + z * z);
c = sqrt(y * y + z * z);
if ((L > a) || (L > b) || (L > c)) {
cout << "Влезет." << endl;
}
else {
cout << "Не влезет." << endl;
}
}
system("pause");
return 0;
}
Ответы (3 шт):
Автор решения: Alexey Vesker
→ Ссылка
Напишите метод для ввода данных, например так:
float getValue(std::string query)
{
float value;
std::cout << query.c_str();
while(!(std::cin >> value))
{
if(std::cin.eof())
{ throw "eof"; }
std::cin.clear(); //Сбрасываем флаг ошибки, если таковая была
std::cin.ignore(1000,'\n'); //Игнорируем оставшиеся в потоке данные
std::cout << "Try again: ";
}
return value;
}
Использовать можно так:
try
{ D = getValue("Длина окружности:"); }
catch(char const *ex)
{ std::cout << ex << std::endl; }
Автор решения: Ex1easy
→ Ссылка
Вроде как сделал, и вроде как оно работает.
#include <iostream>
#include <cmath>
#include <string>
using namespace std;
int integer(const char* msg) {
setlocale(LC_ALL, "");
string tmp;
int value;
while (true) {
cout << msg;
cin >> tmp;
try {
value = stoi(tmp);
cin.ignore(numeric_limits<streamsize>::max(), '\n');
return value;
} catch (invalid_argument& e) {
cin.clear();
cin.ignore(cin.rdbuf()->in_avail());
cout << "Вы ввели не верное значение! Введите цифры!" << endl;
} catch (out_of_range& e) {
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
}
}
int main()
{
setlocale(LC_ALL, "");
float L, D, a, b, c, x, y, z, PI = 3.14;
ret:
D = integer("Введите длину окружности: ");
x = integer("Введите длину параллелепипеда: ");
y = integer("Введите ширину параллелепипеда: ");
z = integer("Введите высоту параллелепипеда: ");
if ((D <= 0) || (x <= 0) || (y <= 0) || (z <= 0)) {
cout << "Введены не коректные данные, введите их заново." << endl;
goto ret;
}
else {
L = D * PI; //Длина окружности
a = sqrt(x * x + y * y);
b = sqrt(x * x + z * z);
c = sqrt(y * y + z * z);
if ((L > a) || (L > b) || (L > c)) {
cout << "Влезет." << endl;
}
else {
cout << "Не влезет." << endl;
}
}
system("pause");
return 0;
}
Автор решения: Mikhailo
→ Ссылка
Переделанный для float ответ от Harry:
float inputFloat(const char * prompt, float m = -numeric_limits<float>::max(),
float M = numeric_limits<float>::max())
{
float N;
for (;;) {
std::cout << prompt << " (число с плавающей точкой от " << m << " до " << M << "): " << std::flush;
if ((std::cin >> N).good() && (m <= N) && (N <= M)) return N;
if (std::cin.fail()) {
std::cin.clear();
std::cout << "Неверный ввод, повторите.\n";
} else {
std::cout << "Число вне допустимого диапазона значений. Повторите ввод.\n";
}
std::cin.ignore(numeric_limits<streamsize>::max(),'\n');
}
}
Для @avp:
Вот такой код:
int main() {
cout << inputFloat(": ");
}
Вот результат:
: (число с плавающей точкой от -3.40282e+38 до 3.40282e+38): q
Неверный ввод, повторите.
: (число с плавающей точкой от -3.40282e+38 до 3.40282e+38): a
Неверный ввод, повторите.
: (число с плавающей точкой от -3.40282e+38 до 3.40282e+38): ^Z
Неверный ввод, повторите.
^Z
: (число с плавающей точкой от -3.40282e+38 до 3.40282e+38): Неверный ввод, повторите.
23
: (число с плавающей точкой от -3.40282e+38 до 3.40282e+38): 23
23