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

Nie działa getline()

VPS Starter Arubacloud
0 głosów
757 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,830 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 (61,370 p.)
@604kamper4

zastosuj . zamiast ->
komentarz 18 lipca 2018 przez Hiskiel Pasjonat (22,830 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 (61,370 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 (61,370 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 (61,370 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 Szeryf (91,420 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 Szeryf (91,420 p.)
Sorki zapomniałem o tym by to później przypisać.

Podobne pytania

0 głosów
2 odpowiedzi 1,654 wizyt
pytanie zadane 10 kwietnia 2019 w C i C++ przez cyrus33 Użytkownik (680 p.)
0 głosów
1 odpowiedź 17,227 wizyt
pytanie zadane 9 marca 2016 w C i C++ przez Munvik Dyskutant (9,350 p.)
0 głosów
2 odpowiedzi 367 wizyt
pytanie zadane 12 grudnia 2019 w C i C++ przez Ganci Użytkownik (670 p.)

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...