Problem z getline

0

Cześć niedawno zacząłem zabawę z obiektowym cpp
Napisałem sobie taki pierwszy program

#include <iostream>

using namespace std;

class Samochod{
public:
    string marka;
    string model;
    int rocznik;
    int przebieg;

    void wczystaj(){
    cout << "Podaj marke samochodu: "<<endl;
    getline(cin,marka);
    cout << "Podaj model: "<<endl;
    getline(cin,model);
    cout << "Podaj rocznik: "<<endl;
    cin >> rocznik;
    cout << "Podaj przebieg: "<<endl;
    cin >> przebieg;
    }
    void wypisz(){
    cout << "Marka: " << marka << endl;
    cout << "Model: " << model << endl;
    cout << "Rocznik: " << rocznik << endl;
    cout << "Przebieg: " << przebieg << endl;

    }
};

int main() {

    Samochod s1;
    s1.wczystaj();
    s1.wypisz();
    Samochod s2;
    s2.wczystaj();
    s2.wypisz();

    return 0;
}

Problem jest przy getline, po uruchomieniu program działa prawidłowo, pyta o marke, model itp, następnie wszystkie dane wypisuje, lecz gdy wypisze dane s1 to zamiast zapytac o marke samochodu s2 to wypisuje "Podaj marke samochodu" i nie czekając na wprowadzenie marki wypisuje "Podaj model samochodu" ale tutaj juz czeka na podanie modelu

0

Czmu nie zrobisz cin >> marka;?

6
#include <iomanip>

// ...

getline(std::cin >> std::ws, marka);
0
Patryk27 napisał(a):

Czmu nie zrobisz cin >> marka;?

Bo gdy napisze alfa romeo to alfe wczyta do marki a romeo do modelu

0
kq napisał(a):
#include <iomanip>

// ...

getline(std::cin >> std::ws, marka);

Dziala, dzięki.
Teraz wystarczy poczytać o tym ws :D i dlaczego z tym działa

0

cin >> string (albo cin >> int wczytuje słowo do najbliższego białego znaku (spacja, nowa linia, tab...)
getline(cin, string) wczytuje do najbliższego znaku nowej linii.

Czyli jak wprowadzisz do wejścia standardowego "a\nb\n0\n0\na\nb\n0\n0\n" (gdzie \n jest efektem potwierdzenia enterem, wprowadzono 2x "a, b, 0, 0"), to za pierwszym obiegiem wczytasz "a", "b", 0, 0, a w buforze wejścia zostanie "\na\nb\n0\n0\n" (czyli bufor zaczyna się od znaku nowej linii). Wtedy getline(cin, string) wczyta taką pustą linię do stringa. cin >> ws zjada wszystkie białe znaki z początku strumienia, więc problem znika.

1 użytkowników online, w tym zalogowanych: 0, gości: 1