#include <string>
std::string input;
std::cin >> input;
El usuario quiere ingresar "Hello World". Pero cin
falla en el espacio entre las dos palabras. ¿Cómo puedo hacer una cin
toma de todo Hello World
?
De hecho, estoy haciendo esto con estructuras y cin.getline
no parece funcionar. Aquí está mi código:
struct cd
{
std::string CDTitle[50];
std::string Artist[50];
int number_of_songs[50];
};
std::cin.getline(library.number_of_songs[libNumber], 250);
Esto produce un error. ¿Algunas ideas?
library
por lo que es claro que es del tipocd
getline
ingresar a unint
. Por supuesto que falla.Respuestas:
Tienes que usar
cin.getline()
:fuente
char
-buffers? Es 2011.cin.getline(input, sizeof(input));
? Además, ¿no debería verificar el estado de devolución?sizeof(input)
en lugar de 100 en la llamada acin.getline()
; eso significaría que puede cambiar el tamaño del búfer de entrada y solo necesita cambiar una línea en lugar de dos líneas. El cambio 2 sería probar el retornocin.getline()
utilizando, por ejemplo,if (!cin.getline(input, sizeof(input))) { ...handle EOF or error... }
o algo similar, para recordarle al OP que las operaciones de entrada, en particular, son vulnerables a comportamientos inesperados. Otras respuestas también necesitan esto.No "falla"; solo deja de leer. Ve una ficha léxica como una "cadena".
Uso
std::getline
:Tenga en cuenta que esto no es lo mismo que
std::istream::getline
, que funciona conchar
buffers de estilo C en lugar destd::string
s.Actualizar
Su pregunta editada se parece poco al original.
Intentabas
getline
ingresar a unint
búfer de caracteres o cadenas. Las operaciones de formateo de secuencias solo funcionan conoperator<<
yoperator>>
. Utilice uno de ellos (y ajuste en consecuencia para la entrada de varias palabras), o utilicegetline
y convierta léxicamente aint
posteriori.fuente
getline
puede incluir la nueva línea de terminación en la cadena que devuelve. Si es así, depende de usted eliminarlo.La Biblioteca estándar proporciona una función de entrada llamada
ws
, que consume espacios en blanco de una secuencia de entrada. Puedes usarlo así:fuente
std::getline(std::cin, s)
me pondría muy desordenado y diría que la entrada interrumpida al esperar entradas en unwhile
/for
loop. ¡Esta opción resolvió mi problema!Utilizar :
la función se puede encontrar en
fuente
cin.getline
no existe en su sistema, ha hecho algo muy mal. Lo más probable es que pasaras los argumentos equivocados. Es mejor no culpar a otros por tus errores ...Desea utilizar la función .getline en cin.
Tomé el ejemplo de aquí . Compruébalo para más información y ejemplos.
fuente
getline
. Está pasado de moda. Use freegetline
en su lugar, que se puede usar constd::string
. [Por cierto, cplusplus.com no es un recurso recomendado]EL CAMINO C
Puede usar la
gets
función que se encuentra en cstdio (stdio.h en c):EL CAMINO C ++
gets
se elimina en c ++ 11.[Recomendado]: puede usar getline (cin, nombre) que está en
string.h
o cin.getline (nombre, 256) que está eniostream
sí mismo.fuente
gets
es imposible de usar de forma segura. Incluso se ha eliminado por completo en C11.Prefiero utilizar el siguiente método para obtener la entrada:
En realidad, es muy fácil de usar en lugar de definir la longitud total de la matriz para una cadena que contiene un carácter de espacio.
fuente