2012-06-21 10 views
5

Puede que no sea un error, pero no sé qué está pasando. Mi primera entrada se repite para str1 en la segunda iteración, y es la misma desde entonces. Solo la primera iteración va bien.¿Esto es un error con getline(), o estoy haciendo algo mal? Forma correcta de usar getline()?

#include <iostream> 
#include <string> 
using namespace std; 

int main() { 

cout << " \n Enter two words. \n " ; 
char c = 'y'; 
string str; 
string str1; 
while (c == 'y'){ 

    getline(cin,str); 

    getline (cin,str1); 

    cout << " \n\n str : " << str << " str1 : " << str1 ; 
    cout << " \n Continue ? \n " ; 
    cin >> c; 
} 

return 0; 
} 

La salida es:

 
Enter two words. 
hello world 
this is mr 


str : hello world str1 : this is mr 
Continue ? 
y 
hello world 


str : str1 : hello world 
Continue ? 
n 


+2

Después de presionar 'y', probablemente presione Enter. Debes considerar qué parte del programa lee la nueva línea cuando presionas Enter. – nos

+0

@chris cin es un objeto, tal vez te refieres al operador >> –

+0

¡Bienvenido a SO! Gracias por proporcionar un programa corto completo que demuestra su problema. Eso fue * muy * útil de tu parte. Por favor, consulte http://sscce.org para más información. –

Respuesta

3

Añadir

cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

después de su

cin >> c; 

Considere la siguiente entrada:

dog 
    cat 
    y 
    owl 
    fish 
    n 

Si examinamos los personajes que están presentes en el flujo de entrada de forma individual, ya veremos:

d o g \n c a t \n y \n o w l \n f i s h \n n \n 

La primera llamada a getline consume dog\n; el segundo consume cat\n, dejando esto:

y \n o w l \n f i s h \n n \n 

La primera llamada a cin >> c consume sólo ypero no la nueva línea posterior, dejando esto:

\n o w l \n f i s h \n n \n 

Ahora, comienza la diversión: ¿Qué ocurre durante la próxima llamada al getline? Por qué se lee hasta la próxima línea nueva, por supuesto. Por lo tanto, la siguiente llamada al getline devuelve una línea vacía, y deja owl... en la secuencia de entrada.

La solución, como indiqué anteriormente, es consumir el resto de la línea de entrada (ahora inútil).

+0

Gracias, estaba pensando lo mismo. Me lo confirmaste En cuanto a la solución, estoy limpiando el buffer cin, usando ignore(). Aún así no funcionó. Coz, estaba poniéndolo en la posición incorrecta, es decir, antes de cin >> c.(Es una parte del proyecto, así que hay un cin >> año antes de aceptar la elección.) – ani

1

Como dice rob.

Pero una solución alternativa que se ve mejor:

// change 
char c = 'y'; 
.... 
while (c == 'y'){ 
.... 
    cin >> c; 

// Into 
std::string c = "y"; 
.... 
while (c == "y"){ 
.... 
    std::getline(cin, c); 

Cuando se trata de la entrada del usuario Manual debe tener cuidado de usar el operador >>, ya que esto deje siempre el '\ n' en la entrada. Lo que significa que puede usar un método que recupera el carácter '\ n' (getline()) o puede eliminarlo después de las palabras (ignore()).

+0

Gracias, mira este fragmento encontré la posición correcta para ignorar() el cin. :-) – ani

Cuestiones relacionadas