ввод c cin не работает?

#c

#c

Вопрос:

 #include <iostream>
#include <string>

struct Car{
    std::string model;
    unsigned int year;
};

int main(){
    using namespace std;

    int carNum;
    cout << "How many cars do you wish you catalog? ";
    cin >> carNum;
    Car * cars = new Car[carNum];

    for (int i=0;i<carNum;i  ){
        cout << "Car #" << i << endl;
        cout << "Please enter the make: ";
        getline(cin, cars[i].model);

        cout << "Please enter the year made: ";
        cars[i].year = cin.get();
    }

    cout << "Here's your collection" << endl;

    for (int i=0;i<carNum;i  ){
        cout << cars[i].model << " " << cars[i].year << endl;
    }

    delete [] cars;

    return 0;
}
  

Когда я выполняю программу, getline(cin, car[i].model) просто пропускается. Почему это?

вот так:

 Car #2
Please enter the make: Please enter the year made:
  

Комментарии:

1. Что значит «пропущено»?

2. Вам нужно быть более ясным, когда вы говорите, что это «просто пропускается». Почти наверняка код выполняется. Пожалуйста, опишите симптомы , является ли cars [i].model всегда пустым?

Ответ №1:

Простая причина.

Когда вы это делаете, cin >> whatever остается n символ a (он был добавлен, когда вы нажали Enter). По умолчанию getline выполняется чтение до следующего n , поэтому при следующем чтении будет просто прочитана пустая строка.

Решение состоит в том, чтобы отказаться от этого n . Вы можете сделать это, поместив это:

 cin.ignore(numeric_limits<streamsize>::max(),'n');
  

Сразу после cin >> carNum .

Не забудьте включить, limits чтобы использовать numeric_limits .

Комментарии:

1. Ах да. Я мог бы также сделать (cin >> carNum).get();

2. Или, если вы не хотите быть отвратительно педантичным, вы можете написать достаточно большое число вместо numeric_limits бла-бла-бла max.

3. @Zac проблема в том, что ОС не является педантичной, что код в какой-то момент сломается. Возможно, здесь это не имеет значения из-за простоты программы, но привычку к педантичности нам нужно поощрять, а не презирать, поскольку однажды я буду иметь значение.

4. @окончательный сбой. Что произойдет, если я введу ’34 <enter>’, теперь ваш get считывает пробел и код прерывается.

Ответ №2:

После каждого вызова cin с использованием оператора вставки. Вы должны вызвать, cin.ignore() если хотите cin.getline () , чтобы сработало.

Поскольку cin>> оставляет после себя символ ‘n’ при нажатии enter, и из-за этого, когда вы используете getline (), он подхватывает n и не принимает никаких входных данных, поскольку он находит n во входном потоке, который является разделителем по умолчанию.

Таким образом, вы можете либо выполнять cin.ignore () после каждого cin>>, либо просто установить символ-разделитель cin.getline ()

Комментарии:

1. Чем этот ответ отличается от ответа @EtienneDeMartel от 4 ’11 мая в 1:14?