Problem z getline

Problem z getline
BA
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 2 lata
  • Postów:52
0

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

Kopiuj
#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

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
0

Czmu nie zrobisz cin >> marka;?


kq
Rolls Royce (cin >> string wczytuje do pierwszego białego znaku)
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:2 minuty
  • Lokalizacja:Szczecin
6
Kopiuj
#include <iomanip>

// ...

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

BA
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 2 lata
  • Postów:52
0
Patryk27 napisał(a):

Czmu nie zrobisz cin >> marka;?

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

BA
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 2 lata
  • Postów:52
0
kq napisał(a):
Kopiuj
#include <iomanip>

// ...

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

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

kq
No to 👍 i ✓ ;​)
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:2 minuty
  • Lokalizacja:Szczecin
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.


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.