std :: cin.getline () против std :: cin - PullRequest
28 голосов
/ 20 января 2011

Когда следует использовать std::cin.getline()?Чем он отличается от std::cin?

Ответы [ 4 ]

32 голосов
/ 20 января 2011

Давайте разберем std::cin.getline().Во-первых, есть std::.Это пространство имен, в котором живет стандартная библиотека.Он имеет сотни типов, функций и объектов.

std::cin такой объект.Это стандартный объект ввода символов, определенный в <iostream>.У него есть несколько собственных методов, но вы также можете использовать его со многими бесплатными функциями.Большинство из этих методов и функций являются способами получения одного или нескольких символов из стандартного ввода.

Наконец, .getline() является одним из таких методов std::cin (и других подобных объектов).Вы сообщаете ему, сколько символов он должен получить от объекта с левой стороны (std::cin здесь) и где разместить эти символы.Точное количество символов может варьироваться: .getline() остановится в трех случаях: 1. Достигнут конец строки 2. На входе не осталось символов (обычно это не происходит на std::cin, так как вы можете сохранитьнабор текста) 3. Читается максимальное количество символов.

Существуют и другие методы и функции, которые можно использовать с объектом std::cin, например,

  std::string s;
  int i;
  std::cin >> s; // Read a single word from std::cin
  std::cin >> i; // Read a single number from std::cin
  std::getline(std::cin, s); // Read an entire line (up to \n) from std::cin
  std::cin.ignore(100); // Ignore the next 100 characters of std::cin
20 голосов
/ 20 января 2011

В случае, когда char *, std::cin.getline получает строку, вместо std::cin получает первое слово.

9 голосов
/ 20 января 2011

Вы читали какую-либо документацию (например, http://www.cplusplus.com/reference/string/getline/)?

Как правило, std::cin (или, в более общем случае, любой std::istream) используется непосредственно для получения форматированного ввода, например int x; std::cin >> x;. std::cin.getline() используется просто для заполнения необработанного буфера char *.

0 голосов
/ 19 июня 2019

Как уже говорили другие (даже лучше) грубо говоря, используйте getline(), чтобы прочитать всю строку (т. Е. Строку, заканчивающуюся \n), и cin>>var, чтобы прочитать число, совместимое с типом var (целое число, число с плавающей запятой, двойное и т. д.) или одно слово.

В этом ответе я хочу подчеркнуть проблему, которая возникает при смешивании двух методов.Когда вы делаете:

int a;
string s;
cin>>a;
getline(cin, s)

cin оставляет конец строки, \n, символ, который затем читается getline();.Эту проблему можно решить, используя cin.ignore().

int a;
string s;
cin>>a;
cin.ignore();
getline(cin, s)
...