std::cin.getline( ) frente a std::cin

4 minutos de lectura

stdcingetline frente a stdcin
Sencillez

Cuando debe std::cin.getline() ¿ser usado? en que se diferencia std::cin?

1646972528 653 stdcingetline frente a stdcin
MSalters

Echemos std::cin.getline() aparte. Primero, hay std::. Este es el espacio de nombres en el que vive la biblioteca estándar. Tiene cientos de tipos, funciones y objetos.

std::cin es tal objeto. Es el objeto de entrada de caracteres estándar, definido en <iostream>. Tiene algunos métodos propios, pero también puede usarlo con muchas funciones gratuitas. La mayoría de estos métodos y funciones son formas de obtener uno o más caracteres de la entrada estándar.

Finalmente, .getline() es uno de esos métodos de std::cin (y otros objetos similares). Le dices cuántos caracteres debe obtener del objeto en su lado izquierdo (std::cin aquí), y dónde poner esos caracteres. El número exacto de caracteres puede variar: .getline() se detendrá en tres casos: 1. Se llega al final de una línea 2. No quedan caracteres en la entrada (no sucede normalmente en std::cin como puede seguir escribiendo) 3. Se lee el número máximo de caracteres.

Existen otros métodos y funciones que se pueden utilizar con el std::cin objeto, por ejemplo

  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

stdcingetline frente a stdcin
alvelcom

En caso de char*, std::cin.getline obtener línea, en lugar de std::cin obtener la primera palabra.

  • No entiendo esta respuesta. std::cin no obtiene nada; es solo un objeto. Tienes que hacer algo con él (por ejemplo, llamar a una función miembro como get) antes de que haga algo.

    –CB Bailey

    20 de enero de 2011 a las 10:56

  • char s1[256], s2[256]; std::cin >> s1; cin.getline(s2, 256);

    – alvelcom

    20 de enero de 2011 a las 11:14


  • std::cin >> s1 es una llamada a una función global istream& operator>> (istream&, char*)

    – eq-

    20 de enero de 2011 a las 11:22

  • Esta respuesta necesita ser editada. La redacción y la explicación son confusas.

    –Arjuna Deva

    19 de abril de 2021 a las 13:02

1646972529 416 stdcingetline frente a stdcin
Oliver Charlesworth

¿Leíste alguna documentación (p. ej. http://www.cplusplus.com/reference/string/getline/)?

Básicamente, std::cin (o más generalmente, cualquier std::istream) se usa directamente para obtener una entrada formateada, por ejemplo int x; std::cin >> x;. std::cin.getline() se utiliza simplemente para llenar un crudo char * buffer.

  • el miembro getline no te da un std::stringse utiliza para llenar un char* buffer. El getline que te da un std::string es la función libre std::getline.

    – Etarion

    20 de enero de 2011 a las 10:31

  • @Oli. Sí, vi la documentación un poco pero no entendí la idea. Ahora creo que está más claro. Gracias.

    – Simplicidad

    20 de enero de 2011 a las 10:40

(Muy simplificado) Mi respuesta es que std :: cin.getline() puede contener espacios, mientras que std :: cin >> no poder.

Como ya otros han respondido (incluso mejor) en términos generales, use getline() para leer una línea completa (es decir, una cadena que termina con \n) y cin>>var para leer un número compatible con el tipo de var (entero, flotante, doble, etc.) o una sola palabra.

En esta respuesta quiero enfatizar un problema que surge al mezclar los dos métodos. Cuando tu lo hagas:

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

cin deja un final de línea, \ncarácter que luego es leído por getline();. Es posible superar este problema utilizando cin.ignore().

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

  • cin.ignore() solo descartará un solo carácter, mientras que cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' ); descartará el resto de la línea, incluido el carácter de nueva línea. No parece significativo usar cin.ignore() en este caso, porque cin>>a solo leerá una sola palabra. Por lo tanto, no puede suponer que el siguiente carácter será el carácter de nueva línea.

    – Andreas Wenzel

    11 mayo 2021 a las 15:28


  • cin.ignore() solo descartará un solo carácter, mientras que cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' ); descartará el resto de la línea, incluido el carácter de nueva línea. No parece significativo usar cin.ignore() en este caso, porque cin>>a solo leerá una sola palabra. Por lo tanto, no puede suponer que el siguiente carácter será el carácter de nueva línea.

    – Andreas Wenzel

    11 mayo 2021 a las 15:28


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad