2016-02-09 3 views
2

Чтобы изучить C++, я переписываю программу, написанную на Python.Проверьте, является ли ввод целочисленным

Я написал эту

n = 0 
while n < 2: 
    try: 
     n = int(raw_input('Please insert an integer bigger than 1: ')) 
    except ValueError: 
     print 'ERROR!' 

для того, чтобы получить целое число больше 1 от пользователя.

Это то, что я написал в C++ на данный момент:

int n = 0; 
while (n < 2) { 
    cout << "Please insert an integer bigger than 1: "; 
    cin >> n; 
} 

Я посмотрел на примерки улове и, кажется, довольно прямо вперед. Моя забота о том, как проверить ввод, является целым числом. Я читал о cin.fail(), но я не мог найти официального документа, и я действительно не понял, как это работает.

Итак, как я могу проверить, является ли вход целым?

В целом, как я могу проверить, есть ли вход «что-нибудь»?

+1

http://en.cppreference.com/w/ cpp/io/basic_ios/fail – LogicStuff

+0

@LogicStuff, я прочитал его, и я почти ничего не понял (новичок здесь). Не могли бы вы в кратчайшие сроки объяснить на непрофессионалы? – Pigna

ответ

4

Для такой ситуации вы, вероятно, захотите прочитать ввод как строку, а затем проверить строку (например, «содержит только цифры, максимум до N цифр»). Если и только если он проходит проверку, выведите из него int.

Можно также совместить проверку и преобразование - например, Boost lexical_cast<int>(your_string) попытается проанализировать int из строки и выбросить исключение, если он не сможет преобразовать всю вещь в int.

+0

Почему бы не ['std :: basic_ios :: operator bool'] (http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool)? – LogicStuff

+2

@LogicStuff, проверяющий состояние потока, работает только в определенных сценариях. Если я буду вводить '15.30' в' int' 'cin', это будет хорошо, но в потоке останется' .30'. – NathanOliver

+0

@LogicStuff: Как намекнул Натан, состояние потока сообщает вам, начались ли входные данные с хотя бы одним символом, который можно было преобразовать в нужный тип. В этом случае звучит (по крайней мере, для меня), как будто он хочет проверить, что * все * вместо этого может быть преобразован вход. –

2

Ваш код Python может быть переведен непосредственно, если вы используете C++ 11's std::stoi в сочетании с std::getline, чтобы прочитать целую строку ввода. Это намного проще, чем бороться со стандартной обработкой ошибок ввода-вывода, которая, возможно, не имеет очень удобного интерфейса.

std::stoi бросает std::invalid_argument если вход не может быть корректно обрабатываются как целое число, а std::out_of_range, если число слишком мало или слишком велико, чтобы поместиться в int.

#include <iostream> 
#include <string> 

int main() { 
    int n = 0; 
    while (n < 2) { 
     std::cout << "Please insert an integer bigger than 1: "; 
     std::string input; 
     std::getline(std::cin, input); 
     try { 
      n = std::stoi(input); 
     } catch (std::exception const&) { 
      std::cerr << "ERROR!\n"; 
     } 
    } 
} 

Если вы хотите, чтобы сделать код еще более похож на его эквивалент Python, то вы можете инкапсулировать вход в функцию:

#include <iostream> 
#include <string> 

int raw_input(std::string const& message) 
{ 
    std::cout << message; 
    std::string input; 
    std::getline(std::cin, input); 
    return std::stoi(input); 
} 

int main() { 
    int n = 0; 
    while (n < 2) { 
     try { 
      n = raw_input("Please insert an integer bigger than 1: "); 
     } catch (std::exception const&) { 
      std::cout << "ERROR!\n"; 
     } 
    } 
} 
+0

У меня есть 2 проблемы: 1. Когда я запускаю свой код, я получаю 'error: 'stoi' не является членом 'std ', 2. Я не понимаю значение 'const & message' внутри raw_input и' const & 'внутри catch. Вы можете объяснить, пожалуйста? – Pigna

+1

@Pigna: Я думаю, ваш компилятор слишком стар. Получите обновление, чтобы иметь поддержку C++ 11. 'const &' означает "const reference". Как правило, пропускают неизменяемые строки, подобные этому, чтобы избежать ненужных копий. Однако такие вещи рассматриваются во вводных книгах на C++. Вам нужно учиться с книгой, если вы серьезно относитесь к этому языку. –

+0

Мне не нужно было обновлять g ++, мне просто нужно было добавить '--std = C++ 11'. Я серьезно отношусь к этому, я только начал изучать learncpp.com. Но я предпочитаю, чтобы мои руки были грязными, прежде чем закончить курс. – Pigna