cin.sync(); oraz getline. Dlaczego pomija cout.

cin.sync(); oraz getline. Dlaczego pomija cout.
MG
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:10
0

Witajcie, mam problem ze zrozumieniem pewnego zjawiska. Otóż jeśli mam taki kod:

Kopiuj
 #include <iostream>

using namespace std;

struct DC_and_Marvel
{
string who;
string title;
int years;
};
int main()
{

    DC_and_Marvel *ps = new DC_and_Marvel;

    cout << "Jaki tytul nosi komis: ";
    getline(cin, (*ps).title);

    cout << "Kto napisal komiks: ";
    getline(cin, (*ps).who);
    cout << "Jaki rok wydania: ";
    cin>>(*ps).years;

    cout << (*ps).who << ", " << (*ps).title << ", " << (*ps).years;
    delete ps;
    return 0;
}

i on działa bez zarzutu, wszystko rozumiem, ale gdy tylko usunę

Kopiuj
getline(cin, (*ps).title); 

i skompiluje programik, to po wpisaniu tytułu, drugie pytanie zostaje pomijane i wczytuje kolejne pytanie. Wtedy wystarczy dodać po pierwszym getline cin.sync();

Kopiuj
 i wszystko działa poprawnie.
Do tej pory dowiedziałem się jak działa bufor czyszczący ale zaskoczyło mnie zachowanie programu bez wypisywania komendy czyszczącej. Dlaczego pojawia mi się pytanie a pomija cina wyświetlając kolejne? 
Gdy wyświetlam na końcu wynik, to nie widzi mi nawet spacji ani zera. Nie jestem pewny tego czego się dowiedziałem, dlatego proszę o pomoc.
carlosmay
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 5 lat
  • Lokalizacja:Pabianice
4

Czyszczenie bufora

Kopiuj
cin.sync() 

, to efekt uboczny. Ta metoda nie do tego służy.
Metoda

Kopiuj
cin.ignore() 

jest do tego celu.

Użycie operatora

Kopiuj
>> 

po wczytaniu danych pozostawia znak nowego wiersza.
Po użyciu tego operatora oczyść bufor strumienia i problem zniknie.
Podobny wątek


edytowany 1x, ostatnio: carlosmay
mlyszczek
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Lokalizacja:Wrocław
  • Postów:167
4

Zamiast (*ps).years; możesz używać ps->years, a nawet powinieneś.

MG
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:10
0

Dziękuje za wskazanie błędu i temat o takim samym błędzie. Teraz wszystko rozumiem :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.