Как запретить ввод букв?

Программа производит расчет на то, влезет ли параллелепипед в окружность, проблема в том что пользователь за место цифр допустим, может ввести букву и тогда вся программа падает. Нужно сделать защиту от дураков и запретить ввод букв. Подскажите пожалуйста как это можно сделать?

#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
→ Ссылка