Проверка входного потока cin создает целое число

Я печатал это и просит пользователя ввести два целых числа, которые затем станут переменными. Оттуда он будет выполнять простые операции.

Как заставить компьютер проверить, является ли введенное целое число или нет? А если нет, попросите пользователя ввести целое число. Например: если кто-то вводит "a" вместо 2, то он скажет им повторно ввести число.

спасибо

 #include <iostream>
using namespace std;

int main ()
{

    int firstvariable;
    int secondvariable;
    float float1;
    float float2;

    cout << "Please enter two integers and then press Enter:" << endl;
    cin >> firstvariable;
    cin >> secondvariable;

    cout << "Time for some simple mathematical operations:n" << endl;

    cout << "The sum:n " << firstvariable << "+" << secondvariable 
        <<"="<< firstvariable + secondvariable << "n " << endl;

}

6 ответов


вы можете проверить так:

int x;
cin >> x;

if (cin.fail()) {
    //Not an int.
}

кроме того, вы можете продолжать получать входные данные, пока не получите int через:

#include <iostream>



int main() {

    int x;
    std::cin >> x;
    while(std::cin.fail()) {
        std::cout << "Error" << std::endl;
        std::cin.clear();
        std::cin.ignore(256,'\n');
        std::cin >> x;
    }
    std::cout << x << std::endl;

    return 0;
}

EDIT: чтобы обратиться к комментарию ниже относительно ввода, такого как 10abc, можно изменить цикл, чтобы принять строку в качестве ввода. Затем проверьте строку на любой символ, а не число, и обработайте эту ситуацию соответствующим образом. В этой ситуации не нужно очищать/игнорировать входной поток. Проверка строки-это просто числа, преобразуйте строку обратно в целое. Я имею в виду, это было так неожиданно. Возможно, есть лучший способ. Это не сработает, если вы принимаете поплавки / двойники (придется добавить '. в строке поиска).

#include <iostream>
#include <string>

int main() {

    std::string theInput;
    int inputAsInt;

    std::getline(std::cin, theInput);

    while(std::cin.fail() || std::cin.eof() || theInput.find_first_not_of("0123456789") != std::string::npos) {

        std::cout << "Error" << std::endl;

        if( theInput.find_first_not_of("0123456789") == std::string::npos) {
            std::cin.clear();
            std::cin.ignore(256,'\n');
        }

        std::getline(std::cin, theInput);
    }

    std::string::size_type st;
    inputAsInt = std::stoi(theInput,&st);
    std::cout << inputAsInt << std::endl;
    return 0;
}

Хех, это старый вопрос, который может использовать лучший ответ.

ввод пользователя должен быть получен как строка а то попытка-преобразованный к типу данных, который вы хотите. Удобно, что это также позволяет вам отвечать на такие вопросы, как "какой тип данных является моим вводом?"

вот функция, которую я использую много. Существуют и другие опции, например в Boost, но основная предпосылка та же: попытка выполнить строку→тип преобразование и наблюдать успех или неудачу:

template <typename T>
std::optional <T> string_to( const std::string& s )
{
  std::istringstream ss( s );
  T result;
  ss >> result >> std::ws;      // attempt the conversion
  if (ss.eof()) return result;  // success
  return {};                    // failure
}

С помощью optional type - это только один способ. Вы также можете создать исключение или вернуть значение по умолчанию при сбое. Все, что подходит для твоей ситуации.

вот пример его использования:

int n;
std::cout << "n? ";
{
  std::string s;
  getline( std::cin, s );
  auto x = string_to <int> ( s );
  if (!x) return complain();
  n = *x;
}
std::cout << "Multiply that by seven to get " << (7 * n) << ".\n";

ограничения и идентификация типа

для того, чтобы это работало, конечно, должен существовать метод однозначного извлечения типа данных из потока. Этот это естественный порядок вещей в C++ - это, как обычно. Так что никаких сюрпризов.

следующее предостережение заключается в том, что некоторые типы включают другие. Например, если вы пытаетесь различать int и double, проверка int во-первых, так как все, что преобразуется в int тоже double.


в c есть функция, называемая isdigit(). Это вас вполне устроит. Пример:

int var1 = 'h';
int var2 = '2';

if( isdigit(var1) )
{
   printf("var1 = |%c| is a digit\n", var1 );
}
else
{
   printf("var1 = |%c| is not a digit\n", var1 );
}
if( isdigit(var2) )
{
  printf("var2 = |%c| is a digit\n", var2 );
}
else
{
   printf("var2 = |%c| is not a digit\n", var2 );
}

С здесь


Если istream не удается вставить, он установит бит сбоя.

int i = 0;
std::cin >> i; // type a and press enter
if (std::cin.fail())
{
    std::cout << "I failed, try again ..." << std::endl
    std::cin.clear(); // reset the failed state
}

вы можете настроить это в цикле do-while, чтобы получить правильный тип (int в этом случае) правильно вставлено.

дополнительные сведения: http://augustcouncil.com/~tgibson/учебник/iotips.сообщение: напрямую


вы можете использовать само имя переменных, чтобы проверить, является ли значение целым числом. например:

#include <iostream>
using namespace std;

int main (){

int firstvariable;
int secondvariable;
float float1;
float float2;

cout << "Please enter two integers and then press Enter:" << endl;
cin >> firstvariable;
cin >> secondvariable;

if(firstvariable && secondvariable){
    cout << "Time for some simple mathematical operations:\n" << endl;

    cout << "The sum:\n " << firstvariable << "+" << secondvariable 
    <<"="<< firstvariable + secondvariable << "\n " << endl;
}else{
    cout << "\n[ERROR\tINVALID INPUT]\n"; 
    return 1; 
} 
return 0;    
}

вы можете использовать :

int a = 12;
if (a>0 || a<0){
cout << "Your text"<<endl;
}

Я уверен, что это работает.