Почему cin >> (строка) остановилась после сбоя cin >> (int)? - PullRequest
0 голосов
/ 13 декабря 2018

Когда вызываются cin >> (int) и cin >> (string), когда первый ввод неверен для целого числа, кажется, что cin >> (string) не сможет получить второй ввод, даже если онправильная строка.

Исходный код прост как:

cout<<"Please enter count and name"<<endl;;
int count;
cin>>count;     // >> reads an integer into count
string name;
cin>>name;      // >> reades a string into name

cout<<"count: "<<count<<endl;
cout<<"name: "<<name<<endl;

Тестовые случаи:

Случай 1: Введите символы (которые не подходят для int) и символы

Пожалуйста, введите количество и имя

рекламный номер

количество: 0

имя:

Случай 2: Введите цифры и символы

Пожалуйста, введите количество и имя

30 объявление

количество: 30

имя: объявление

Случай 3: Введите цифры и цифры (которые могут быть приняты как строки)

Пожалуйста, введите количество и имя

20 33

количество: 20

имя: 33

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Вы можете проверить оператор ввода, если он выполнен успешно или нет, с помощью метода

cin.good ()

Если оператор ввода не выполнен, он возвращает falseостальное правда.Вот небольшой пример:

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
  int x; 

  // prompt the user for input 
  cout << "Enter an integer: " << "\n"; 
  cout << "cin.good() value: " << cin.good() << "\n";
  // get input 
  cin >> x; 
  cout << "cin.good() value: " << cin.good() << "\n";
  // check and see if the input statement succeeded 
  if (!cin) { 
    cout << "That was not an integer." << endl; 
    return EXIT_FAILURE; 
  } 

  // print the value we got from the user 
  cout << x << endl; 
  return EXIT_SUCCESS; 
}

Вывод:

Enter an integer: 
cin.good() value: 1
asd
cin.good() value: 0
That was not an integer.
0 голосов
/ 13 декабря 2018

Поток имеет флаг внутренней ошибки, который после установки остается установленным до тех пор, пока вы его явно не очистите.При сбое чтения, например, из-за того, что вход не может быть преобразован в требуемый тип, устанавливается флаг ошибки, и любая последующая операция чтения даже не будет выполняться, пока вы не очистите этот флаг:

int main() {

    stringstream ss("john 123");

    int testInt;
    string testString;

    ss >> testInt;
    if (ss) {
        cout << "good!" << testInt << endl;
    } else {
        cout << "bad!" << endl;
    }

    ss >> testString;
    if (ss) {
        cout << "good!" << testString << endl;
    } else {
        cout << "bad!" << endl;
    }

    ss.clear();
    ss >> testString;
    if (ss) {
        cout << "good:" << testString << endl;
    } else {
        cout << "bad!";
    }
}

Выход:

bad!
bad!
good:john
...