Проверка десятичного ввода для Cin? - PullRequest
0 голосов
/ 20 октября 2018

Я пытаюсь подтвердить ввод данных пользователем о том, насколько большим должен быть массив.Я проверяю, есть ли size < 1 и есть ли в коде десятичное место с помощью:

int size = 0;
do {
    size = 0;
    cout << "Input an array size for your words array: ";
    cin >> size;
    if (floor(size) != size || size < 1) {
        cout << "Hey that's not a valid size!\n";
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }
} while (floor(size) != size || size < 1);

Проблема, с которой я сталкиваюсь, заключается в том, что числа, такие как -1, 0, .3.9 все подтверждают нормально, но числа как 1.2 будут иметь size == 1, тогда как .2 остается в очереди.Есть ли способ убрать эти десятичные дроби?Я попытался использовать только size < 1 и логическое значение пола само по себе.

Спасибо!

1 Ответ

0 голосов
/ 20 октября 2018

Когда пользователь вводит что-то вроде «1.2» и вы пытаетесь извлечь int из входного потока, оператор извлечения потока >> успешно извлечет 1, а остальное остается во входном потоке.Поэтому все, что вам нужно сделать, - это проверить, не осталось ли в потоке ничего, кроме пробелов.

#include <limits>
#include <cctype>
#include <iostream>

// This function peeks at the next character in the stream and only re-
// moves it from the stream if it is whitespace other than '\n'.
std::istream& eat_whitespace(std::istream &is)
{
    int ch;
    while ((ch = is.peek()) != EOF &&
           std::isspace(static_cast<unsigned>(ch)) && // Don't feed isspace()
           ch != '\n')                                // negative values!
    {
        is.get();
    }
    return is;
}

int main()
{
    int size;
    bool valid{ false };
    while (std::cout << "Input an array size for your words array: ",
           !(std::cin >> size >> eat_whitespace) ||
           size < 1 ||
           std::cin.get() != '\n') // since all whitespace has been eaten up
                                   // by eat_whitespace, the next character 
                                   // should be a newline. If it is not there 
                                   // is some other garbage left in the stream.
    {
        std::cerr << "Hey that's not a valid size!\n";
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...