• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Nie działa getline()

0 głosów
159 wizyt
pytanie zadane 18 lipca 2018 w C i C++ przez 604kamper4 Nowicjusz (180 p.)

Witam.

Mam pewien problem. Stworzyłem strukturę,  następnie dynamiczne tablicę struktur.

 

using namespace std;

struct car
{
    string marka;
    int rok;
};

int main()
{
    int l_car;


    cout << "Ile samochdowo chcesz skatologwac? ";
    cin >> l_car;

    car *ps = new car[l_car];

    for (int i = 0; i < l_car; i++)
    {
        cout << "Samochod #" << i + 1 << endl;
        cout << "Prosze podac marke: ";
        getline(cin,ps[i]->marka);
        cout << "Prosze podac rok produkcji: ";
        cin >> ps[i]->rok;

    };

    return 0;
}

Problem jest w miejscu gdzie próbuję wczytać całą linię do struktury(getline). Program mi się nie kompiluje , a jak się skompiluje to omija część ze wczytywaniem.

Co zrobiłem źle? Proszę o pomoc.

komentarz 18 lipca 2018 przez Hiskiel Pasjonat (22,800 p.)
Pokaż błędy kompilatora.
komentarz 18 lipca 2018 przez 604kamper4 Nowicjusz (180 p.)
error:base operand of  '->'  has non-pointer type 'car'
1
komentarz 18 lipca 2018 przez Bondrusiek Maniak (51,630 p.)
@604kamper4

zastosuj . zamiast ->
komentarz 18 lipca 2018 przez Hiskiel Pasjonat (22,800 p.)
Czemu? To pointer
komentarz 18 lipca 2018 przez 604kamper4 Nowicjusz (180 p.)
Stosowanie kropki nie rozwiązuje problemu.

Już wszytko działa. Pomógł mi ktoś inny, ale tobie też dziękuję :)
komentarz 18 lipca 2018 przez Bondrusiek Maniak (51,630 p.)

@Hiskiel

Możesz użyć strzałki -> aby odwołać się do danego element lecz wcześniej musisz pobrać rzutować na wskaźnik

np.

car *ps = new car[10];
ps[0].rok = 2000;

cout << " (&ps[0])->rok; " << (&ps[0])->rok << " ps[0].rok; " << ps[0].rok << endl;

 

3 odpowiedzi

0 głosów
odpowiedź 18 lipca 2018 przez Bondrusiek Maniak (51,630 p.)

Witam,

dodaj na początek plik nagłówkowy <iostream>

#include <iostream>

Wydaje mi się że problemem jest bufor. Przykładowo jak piszesz jakąś liczbę np. 12 to aby ją zatwierdzić to musisz jeszcze przesłać znak '\n' (enter), który później trafia do funkcji getline() i ją zapełnia. Można tu zastosować metody ignore()/sync() do wyczyszczenia zawartości strumienia.

...
    int l_car;
    cout << "Ile samochdowo chcesz skatologwac? ";
    cin >> l_car;
    car *ps = new car[l_car];

    cin.ignore();
    cin.sync();
    
for (int i = 0; i < l_car; i++)
    {
        cout << "Samochod #" << i + 1 << endl;
        cout << "Prosze podac marke: ";

        getline(cin,ps[i].marka);

        cout << "Prosze podac rok produkcji: ";
        cin >> ps[i].rok;

        cin.ignore();
        cin.sync();
    }
...

 

komentarz 18 lipca 2018 przez 604kamper4 Nowicjusz (180 p.)
Jeśli chodzi o #include <iostream> to mam to. Po prostu przypadkowo ominąłem tę linię. :)

Dodanie tych metod nie działa.
komentarz 18 lipca 2018 przez Bondrusiek Maniak (51,630 p.)

Cały kod

#include <iostream>

using namespace std;

struct car
{
    string marka;
    int rok;
};

int main()
{
    int l_car;
    cout << "Ile samochdowo chcesz skatologwac? ";
    cin >> l_car;
    car *ps = new car[l_car];

    cin.ignore();
    cin.sync();

for (int i = 0; i < l_car; i++)
    {
        cout << "Samochod #" << i + 1 << endl;
        cout << "Prosze podac marke: ";

        getline(cin,ps[i].marka);

        cout << "Prosze podac rok produkcji: ";
        cin >> ps[i].rok;

        cin.ignore();
        cin.sync();
    }

    return 0;
}

może coś źle dodałeś. Jakby co podaj komunikat błędu

komentarz 18 lipca 2018 przez 604kamper4 Nowicjusz (180 p.)
Działa. Najwyraźniej coś źle przepisałem.

Dziena ;D
komentarz 19 lipca 2018 przez sp00ky Obywatel (1,760 p.)

@Bondrusiek,

Dokładnie, po pobraniu ilości samochodów do skatalogowania, potrzebny jest znak nowego wiersza, aby można było wprowadzić kolejne dane.

#include <iostream>
#include <string>

// tworzę strukturę która zawiera informacje o samochodzie
struct Car
{
    std::string make;
    int yearMade{};
};

int main()
{
    int howManyCars = 0;
    std::cout << "Ile samochodow chcesz skatalogowac? ";
    (std::cin >> howManyCars).get(); // .get() znak nowego wiersza aby wprowadzić kolejne dane

    // tworzę dynamiczną tablicę struktur Car (collection)
    auto *collection = new Car[howManyCars];

    // pętla zbierająca dane do tablicy struktur
    for (int i = 0; i < howManyCars; i++)
    {
        std::cout << "Samochod numer " << i + 1 << std::endl;
        std::cout << "Podaj marke samochodu: ";
        getline(std::cin, collection[i].make);
        std::cout << "Podaj rok produkcji: ";
        (std::cin >> collection[i].yearMade).get(); // .get() znak nowego wiersza aby wprowadzić kolejne dane
    }
    std::cout << "Twoja kolekcja samochodow: \n";

    // pętla która wyświetla zebrane dane
    for (int i = 0; i < howManyCars; i++)
    {
        std::cout << collection[i].yearMade << " " << collection[i].make << std::endl;
    }
    delete[] collection; // usuwam dynamiczną tablicę

    return 0;
}

 

0 głosów
odpowiedź 18 lipca 2018 przez Dominik Kostencki Użytkownik (650 p.)
Witam, spróbuj  cin.ignore() w pętli.
–1 głos
odpowiedź 18 lipca 2018 przez profesorek96 Maniak (52,240 p.)

Proszę działający kod :

#include <iostream>
using namespace std;
 
struct car
{
    string marka;
    int rok;
};
 
int main()
{
    int l_car;
 
 
    cout << "Ile samochdowo chcesz skatologwac? ";
    cin >> l_car;
 
    car *ps = new car[l_car];
 
    for (int i = 0; i < l_car; i++)
    {
        cout << "Samochod #" << i + 1 << endl;
        cout << "Prosze podac marke: ";
        string tmp;
        int tmpr;
        getline(cin,tmp);
        cout << "Prosze podac rok produkcji: ";
        cin >> tmpr;
 
    }
 
 
    return 0;
}

 

komentarz 18 lipca 2018 przez 604kamper4 Nowicjusz (180 p.)
Jak myślisz po co tworzyłem strukturę?  Dane powinny znajdować się w  strukturze a nie w zwykłej zmiennej.

Przypisywanie zawartości zmiennej do struktury też nie działa
komentarz 18 lipca 2018 przez profesorek96 Maniak (52,240 p.)
Sorki zapomniałem o tym by to później przypisać.

Podobne pytania

0 głosów
2 odpowiedzi 73 wizyt
pytanie zadane 10 kwietnia w C i C++ przez cyrus33 Użytkownik (610 p.)
0 głosów
1 odpowiedź 6,389 wizyt
pytanie zadane 9 marca 2016 w C i C++ przez Munvik Dyskutant (8,450 p.)
0 głosów
1 odpowiedź 699 wizyt
pytanie zadane 24 listopada 2017 w C i C++ przez applepie Początkujący (250 p.)
Porady nie od parady
Forum posiada swój własny chat IRC, dzięki któremu będziesz mógł po prostu pogadać z innymi Pasjonatami lub zapytać o jakiś problem. Podstrona z chatem znajduje się w menu pod ikoną człowieka w dymku.IRC

66,453 zapytań

113,207 odpowiedzi

239,680 komentarzy

46,704 pasjonatów

Przeglądających: 275
Pasjonatów: 18 Gości: 257

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...