#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?