2014-11-07 8 views
5

Sto lavorando a un incarico scolastico e sto sbattendo la testa contro un muro proprio ora cercando di capire perché il mio programma non si comporta come mi piacerebbe!Problemi di C++ che coinvolgono getline() e un ciclo

int main(){ 
    string input; 
    char choice; 

    bool getChoice(char); 
    string getInput(); 

    CharConverter newInput; 

    do{ 
     cout << "Please enter a sentence.\n"; 
     getline(cin, input); 

     cout << newInput.properWords(input) << endl; 

     cout << newInput.uppercase(input) << endl; 
     cout << "Would you like to do that again?\n"; 
     cin >> choice; 



    } while (getChoice(choice) == true); 

    return 0; 
} 

Questo programma funziona bene al primo turno, ma sto avendo un problema quando getChoice() == true, e il fai mentre blocco è in loop una seconda volta. Nel secondo ciclo, il programma mi chiede di inserire nuovamente una frase, ma poi salta semplicemente a "Ti piacerebbe farlo di nuovo?" senza consentire l'input dell'utente o l'output dei risultati delle funzioni properWords() e uppercase(). Ho il sospetto che ci sia qualcosa sulla linea del traguardo che non capisco, ma devo ancora trovarlo attraverso il mio googling. Qualche aiuto là fuori?

modifica: c'è stato un errore nella mia spiegazione originale.

+0

Cosa ingresso stai usando? Se c'è più di una linea nel flusso di input, getline() prenderà la riga successiva senza attendere ulteriori input. – Otaia

+0

Fondamentalmente, quello che sto cercando di fare è consentire all'utente di inserire una frase completa che viene passata alle funzioni dei due membri. Voglio che l'utente sia in grado di digitare una nuova frase nella successiva iterazione ... e così via. – user3468711

+1

Mi piace questa domanda perché l'input stringa contro char è una delle cose che fa inciampare molte persone quando iniziano a scrivere in C/C++ (o in molti altri linguaggi). –

risposta

5

Questo perché l'input di lettura con getline non si combina bene con l'input di lettura carattere per carattere. Quando si immette il carattere Y/ per indicare se si desidera procedere o meno, si preme anche Immettere. Questo inserisce \n nel buffer di input, ma non lo prende da >>. Quando chiami getline, lo \n è proprio lì, quindi la funzione restituisce immediatamente una stringa vuota.

Per risolvere questo problema, fare choice un std::string, utilizzare getline di leggerlo, e inviare il primo carattere di getChoice funzione, in questo modo:

string choice; 
... 
do { 
    ... 
    do { 
     getline(cin, choice); 
    } while (choice.size() == 0); 
} while (getChoice(choice[0])); 
+0

È grandioso! Mi hai migliorato la giornata. – user3468711

Problemi correlati