Как принимать только цифры на входе для cin? [Дубликат]

Вы можете объединить два перехода или больше, а visibility - это то, что пригодится на этот раз.

div {
  border: 1px solid #eee;
}
div > ul {
  visibility: hidden;
  opacity: 0;
  transition: visibility 0s, opacity 0.5s linear;
}
div:hover > ul {
  visibility: visible;
  opacity: 1;
}
  • Item 1
  • Item 2
  • Item 3

( Не забывайте, что префиксы поставщика к свойству transition)

Подробнее в в этой статье

8
задан Bo Persson 13 October 2015 в 11:31
поделиться

2 ответа

Я хотел бы использовать std::getline и std::string для чтения всей строки, а затем только выйти из цикла, когда вы можете преобразовать всю строку в double.

#include <string>
#include <sstream>

int main()
{
    std::string line;
    double d;
    while (std::getline(std::cin, line))
    {
        std::stringstream ss(line);
        if (ss >> d)
        {
            if (ss.eof())
            {   // Success
                break;
            }
        }
        std::cout << "Error!" << std::endl;
    }
    std::cout << "Finally: " << d << std::endl;
}
7
ответ дан Jonas Gröger 27 August 2018 в 22:44
поделиться

Когда cin встречает вход, он не может правильно прочитать указанную переменную (например, ввод символа в целочисленную переменную), он переходит в состояние ошибки и оставляет входной сигнал в его буфере.

Вы должны сделать несколько вещей, чтобы правильно справиться с этим сценарием.

  1. Вы должны проверить это состояние ошибки.
  2. Вам нужно очистить состояние ошибки.
  3. Вы должны либо альтернативно обрабатывать входные данные, которые генерировали состояние ошибки, либо вымыли его, и повторно запустили пользователя.

В следующем коде представлен один из многочисленных способов выполнения эти три вещи.

#include<iostream>
#include<limits>
using namespace std;
int main()
{

    cout << "Enter an int: ";
    int x = 0;
    while(!(cin >> x)){
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        cout << "Invalid input.  Try again: ";
    }
    cout << "You enterd: " << x << endl;        
}

Вы могли бы просто передать какое-то большое значение cin.ignore как 1000, и оно, вероятно, будет вести себя точно так же для всех практических целей.

Вы можете также проверите cin после попытки ввода и обработайте его таким образом, что-то вроде if (! cin) {// очистите ошибку}.

Проверьте ссылку istream для других функций-членов для обработки состояния потока: http://cplusplus.co м / ссылка / iostream / IStream /

19
ответ дан Shiven 27 August 2018 в 22:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: