Ввод с использованием std :: cin не работает для плавающей запятой, только когда значение заканчивается буквой 'e' (как в верхнем, так и в нижнем регистре) - PullRequest
0 голосов
/ 25 сентября 2019

Я написал метод для получения пользовательского ввода из std :: cin и его возврата, и пока он работает для всех моих тестов, за исключением числа с плавающей запятой или двойного числа, за которым следует буква 'e'.

Thisэто метод:

template <typename Arg>
Arg getInput(string message = "")
{
    if (!is_fundamental<Arg>::value && typeid(string) != typeid(Arg))
    {
        return Arg();
    }

    if (!message.empty())
    {
        print(message);
    }

    Arg out;
    cin >> out;

    while (cin.fail())
    {
        cin.clear();
        cin.ignore();
        cin >> out;
    }

    cin.ignore(INT_MAX, '\n');

    return out;

}

Это вызов метода:

getInput<double>("Please Enter a Double: ");

Метод возвращает правильное значение для всего, что я пробовал до сих пор, но std :: cin завершается неудачно, когдазначение завершается символом 'e'.

Например: 12.34 читается как 12.34, ae1.23f1 читается как 1.23, но std :: cin завершается ошибкой на 1.2ef и 12E, потому что сразу за числами следуети 'e'

Как примечание, когда тип возвращаемого значения метода изменяется на float, он по-прежнему вызывает ту же проблему, что и double.Это не имеет никакого смысла для меня, потому что это единственное, что я обнаружил, чтобы программа не работала, поэтому я предполагаю, что именно так std :: cin обрабатывает ввод.

Отказ от ответственности: Я новичок в C ++ из Java, поэтому мой код, вероятно, имеет некоторые другие незначительные ошибки, такие как return Arg ();не будет работать, если у класса нет конструктора по умолчанию, поэтому я должен это исправить.

1 Ответ

1 голос
/ 25 сентября 2019

Если вы введете число, за которым следует e (или E), то cin ожидает, что число будет введено в научная запись .Если после e нет целого числа (отрицательного или иного), то это неверная научная запись, и cin не сможет прочитать ее как число с плавающей запятой float или double.

Ошибкапохоже на ввод чего-то вроде 3...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...