Cuando debe std::cin.getline()
¿ser usado? en que se diferencia std::cin
?
std::cin.getline( ) frente a std::cin
Sencillez
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
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 comoget
) 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 globalistream& 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
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::string
se utiliza para llenar unchar*
buffer. El getline que te da unstd::string
es la función librestd::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, \n
cará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 quecin.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 usarcin.ignore()
en este caso, porquecin>>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 quecin.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 usarcin.ignore()
en este caso, porquecin>>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