cin.ingore () i getline

0
#include <iostream>

struct donatorzy
{
    std::string nazwisko;
    double kwota;
};

int main ()
{
    using namespace std;

    int wplacajacy;
    cout << "Podaj liczbe wplacajacych: ";
    cin >> wplacajacy;
    donatorzy* w = new donatorzy[wplacajacy];
    for(int licznik{0}; licznik < wplacajacy; licznik++)
    {
            cout << "Twoje nazwisko: ";
            cin.ignore();
            getline(cin, w[licznik].nazwisko);
            if(w[licznik].nazwisko == "")
                w[licznik].nazwisko += "brak";
            cout << "Twoja kwota: ";
            cin >> w[licznik].kwota;
    }
    cout << "\n\t\t\tNasi Wspaniali Sponsorzy\n\n";
    for(int licznik{0}; licznik < wplacajacy; licznik++)
        {
            if(w[licznik].kwota > 10000)
                cout << "\t\t\t" << w[licznik].nazwisko << ", " << w[licznik].kwota << endl;
        }
    cout << "\n\t\t\tNasi Sponsorzy\n\n";
    for(int licznik{0}; licznik < wplacajacy; licznik++)
        {
            if(w[licznik].kwota <= 10000)
                cout << "\t\t\t" << w[licznik].nazwisko << ", " << w[licznik].kwota << endl;
        }
        return 0;
}

Mam problem. Nie rozumiem dlaczego jeżeli nie użyje cin.ignore() to pomija mi wyczytywanie przez getline. Do czego dokładnie służy cin.ignore()?

4

ignore ignoruje pewne znaki na wejściu. http://en.cppreference.com/w/cpp/io/basic_istream/ignore

Po wczytaniu cin >> wplacajacy zatwierdzasz enterem, który do liczby już się nie zalicza. Tak więc na wejściu zostaje <nic> i znak nowej linii. getline wczytuje <nic> i kontynuuje aż do pierwszego znaku nowej linii - czyli kończy od razu, wczytując pusty string.

Dodatkowo:

  1. nie używaj nagiego new i delete - to antyidiom w C++
  2. używasz C++11 lub nowszego, użyj ranged fora.
0

Dzięki. O co chodzi z tym antyidiom w C++ i tym ranged for

1

Nowy kod wykorzystujący bezpośrednio new jest prawdopodobnie zły. Jeśli musisz używać delete to na 100% robisz coś źle. C++ ma RAII, ma smart pointery, ma kontenery - używaj ich.

ranged for: http://en.cppreference.com/w/cpp/language/range-for

0

Ok. Dzięki za odpowiedź

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