Использование getline для чтения строки с пробелами в структуре - PullRequest
0 голосов
/ 27 марта 2020

Я хочу читать строки с пробелами в элементах структуры. Пробовал использовать getline, но оба выходных оператора объединены с одним cin для обоих. Согласно аналогичным постам здесь, попытался использовать cin.ignore, но вход не считывается в член структуры. Пожалуйста, помогите. Это часть моего задания, и я новичок в C ++. Вот как выглядит мой код:

#include <string.h>
using namespace std;
struct book {
  string title, author;
  int no_of_pages, year;
  float price;
};
int main() {
  int N;
  cout << "Enter the no. of books whose details are to be entered:" << endl;
  cin >> N;
  book b[N];
  int x;
  for (x = 0; x < N; x++) {
    cout << "Enter the title of book #" << x + 1 << ":" << endl;
    getline(cin, (b[x].title));
    // cin.ignore();
    cin.ignore(1000, '\n');
    cout << "Enter the author's name:" << endl;
    getline(cin, (b[x].author));
    cout << "Enter the no. of pages:" << endl;
    cin >> b[x].no_of_pages;
    cout << "Enter the price of book:" << endl;
    cin >> b[x].price;
    cout << "Enter the year of publishing" << endl;
    cin >> b[x].year;
  }
  for (x = 0; x < N; x++) {
    cout << "\n\n";
    cout << "The details of book" << x + 1 << " are:" << endl;
    cout << "Title          :" << b[x].title << endl;
    cout << "Author         :" << b[x].author << endl;
    cout << "No. of pages   :" << b[x].no_of_pages << endl;
    cout << "Price          :" << b[x].price << endl;
    cout << "Publishing year:" << b[x].year << endl;
    cout << "---------------------------------------------";
  }
  return 0;
}

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

Есть два места, которые вы должны вставить cin.ignore в свой код:

  cout << "Enter the no. of books whose details are to be entered:" << endl;
  cin >> N;
  // First cin.ignore here
  cin.ignore(1000, '\n');
    cout << "Enter the year of publishing" << endl;
    cin >> b[x].year;
    // Second cin.ignore here
    cin.ignore(1000, '\n');

Кроме этого, я вижу еще две проблемы в вашем коде:

  • #include <string> не <string.h>
  • добавить #include <iostream>

Зачем cin.ignore необходимо? Ожидается, что пользователь предоставит ввод с новой строкой ('\ n'). Когда используется getline, он оставляет входной поток в таком состоянии, что следующая попытка чтения ввода из потока начнется со следующей строки. Это не верно для operator >>. int x; cin >> x; делает здесь только то, что читает только целое число, а не символ новой строки, присутствующий сразу после целого числа. Следовательно, следующая попытка чтения продолжится в той же строке. getline не найдет символов перед новой строкой и, следовательно, получит пустую строку. Чтобы избежать этого и эффективно начать чтение со следующей строки, необходимо cin.ignore.

0 голосов
/ 27 марта 2020

Нет смысла использовать cin.ignore() между двумя вызовами на getline. ignore используется для сброса оставшихся символов после цифра c ввода. Таким образом, его можно использовать после ввода чисел c и до следующего getline. Например,

cout << "Enter the title of book #" << x + 1 << ":" << endl;
getline(cin, (b[x].title));
cout << "Enter the author's name:" << endl;
getline(cin, (b[x].author));
cout << "Enter the no. of pages:" << endl;
cin >> b[x].no_of_pages;
cout << "Enter the price of book:" << endl;
cin >> b[x].price;
cout << "Enter the year of publishing" << endl;
cin >> b[x].year;
cin.ignore(1000, '\n');

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

...