Проверка, является ли пользовательский ввод целочисленным [duplicate]

Если ваша строка имеет косую черту (/), вы можете изменить разделитель на «+».

find . -type f -exec sed -i 's+http://example.com+https://example.com+g' {} +

Эта команда будет работать рекурсивно в текущем каталоге.

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 22 August 2018 в 00:07
поделиться

Когда 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 22 August 2018 в 00:07
поделиться
  • 1
    Эта линия cin.ignore очищает его, верно? – Jeff 9 June 2016 в 16:39
  • 2
    @Jeff Да, он очищает буфер. Вы также можете использовать его при использовании cin с getline при вводе данных, поскольку cin оставляет «\n» в буфере и не удаляет (я считаю, не совсем уверен, может быть, это cin.get), поэтому getline просто ограничивает момент, который он прикрепляет к входному буферу, когда он встречает слева над '\n'. – Alpha Mineron 29 September 2017 в 08:01
Другие вопросы по тегам:

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