2012-06-21 20 views
5

To nie może być błąd, ale nie wiem, co się dzieje źle. Mój pierwszy wpis powtarza się dla str1 w 2. iteracji i jest taki sam od tego czasu. Tylko pierwsza iteracja idzie dobrze.Czy jest to błąd z getline(), czy robię coś nie tak. Właściwy sposób użycia 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; 
} 

Wyjście jest:

 
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

Po naciśnięciu 'y', prawdopodobnie naciśnij Enter. Powinieneś zastanowić się, która część programu czyta linię utworzoną po naciśnięciu klawisza Enter. – nos

+0

@ chris cin jest obiektem, może masz na myśli operatora >> –

+0

Witaj w SO! Dziękuję za dostarczenie kompletnego krótkiego programu, który pokazuje Twój problem. To było * bardzo * pomocne z twojej strony. Więcej informacji można znaleźć na stronie http://sscce.org. –

Odpowiedz

3

Dodaj

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

Po

cin >> c; 

Rozważmy następujący wkład:

dog 
    cat 
    y 
    owl 
    fish 
    n 

Jeżeli badamy znaki, które są obecne w strumieniu wejściowym indywidualnie zobaczymy:

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

Pierwsze wywołanie getline zużywa dog\n; drugi zużywa cat\n, pozostawiając w ten sposób:

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

Pierwsze wywołanie cin >> c zużywa tylko yale nie późniejsza nowalinia, pozostawiając w ten sposób:

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

Teraz zaczyna się zabawa: Co się dzieje podczas następne połączenie z getline? Dlaczego oczywiście czyta następny nabój. Więc następnym wywołanie getline zwrotów pusta linia i pozostawia owl... w strumieniu wejściowym.

rozwiązanie, jak wspomniano powyżej, jest do spożywania w pozostałej części (obecnie nieprzydatny) linii wejściowej.

+0

Dzięki, myślałem o tym samym. Potwierdziłeś to dla mnie. Jeśli chodzi o rozwiązanie, wyczyszczam bufor cin, używając funkcji ignore(). Wciąż to nie działało. Coz, umieszczałem go w niewłaściwej pozycji, tj. Przed cin >> c.(Jest to część projektu, więc istnieje >> rok zanim zaakceptuję wybór.) – ani

1

Jak mówi Rob.

Ale alternatywą fix że wygląda ładniej:

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

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

Gdy mamy do czynienia z ręcznego wprowadzania danych przez użytkownika należy być ostrożnym z użyciem >> operatora jak to zawsze opuścić „\ n” na wejściu. Oznacza to, że możesz użyć metody, która pobiera znak "\ n" (getline()) lub możesz ręcznie usunąć je (ignorować()).

+0

Dzięki, spójrz na ten fragment Znalazłem właściwą pozycję do zignorowania() cin. :-) – ani