2012-06-21 15 views
5

Potrebbe non essere un bug, ma non so cosa sta andando storto. La mia prima voce viene ripetuta per str1 alla seconda iterazione ed è allo stesso modo da allora. Solo la prima iterazione va bene.Si tratta di un bug con getline() o sto facendo qualcosa di sbagliato. Modo giusto per usare 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; 
} 

L'output è:

 
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

Dopo aver premuto 'y', probabilmente premi Invio. Dovresti considerare quale parte del programma che legge il newline fatta quando premi Invio. – nos

+0

@chris cin è un oggetto, forse vuoi dire operatore >> –

+0

Benvenuto in SO! Grazie per aver fornito un breve programma completo che dimostra il tuo problema. Era * molto * utile da parte tua. Si prega di consultare http://sscce.org per ulteriori informazioni. –

risposta

3

Aggiungi

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

dopo vostro

cin >> c; 

Si consideri il seguente entrata:

dog 
    cat 
    y 
    owl 
    fish 
    n 

Se esaminiamo i personaggi che sono presenti nel flusso di input singolarmente, vedremo:

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

La prima chiamata a getline consuma dog\n; il secondo consuma cat\n, lasciando in questo modo:

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

La prima chiamata a cin >> c consuma solo yma non il successivo ritorno a capo, lasciando in questo modo:

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

Ora, inizia il divertimento: cosa succede durante la prossima chiamata allo getline? Perché legge fino alla prossima nuova riga, ovviamente. Quindi la prossima chiamata a getline restituisce una riga vuota e lascia owl... nel flusso di input.

La soluzione, come descritto sopra, consiste nel consumare il resto della linea di input (ora inutile).

+0

Grazie, stavo pensando la stessa cosa. L'hai confermato per me. Per quanto riguarda la soluzione, sto cancellando il cin-buffer, usando ignore(). Ancora non ha funzionato. Coz, lo stavo mettendo nella posizione sbagliata, cioè prima di cin >> c.(Fa parte del progetto, quindi c'è un cin >> prima di accettare la scelta.) – ani

1

Come dice rob.

Ma una correzione alternativa che sembra più bello:

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

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

Quando si tratta con l'input manuale si deve fare attenzione di utilizzare l'operatore >> come questo sarà sempre lasciare il '\ n' sull'ingresso. Il che significa che puoi utilizzare un metodo che recupera il carattere '\ n' (getline()) oppure puoi rimuoverlo manualmente afterwords (ignore()).

+0

Grazie, guarda questo frammento ho trovato la giusta posizione per ignorare() il cin. :-) – ani