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

Nie działa getline()

Object Storage Arubacloud
0 głosów
783 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,685 wizyt
pytanie zadane 10 kwietnia 2019 w C i C++ przez cyrus33 Użytkownik (680 p.)
0 głosów
1 odpowiedź 17,309 wizyt
pytanie zadane 9 marca 2016 w C i C++ przez Munvik Dyskutant (9,350 p.)
0 głosów
2 odpowiedzi 368 wizyt
pytanie zadane 12 grudnia 2019 w C i C++ przez Ganci Użytkownik (670 p.)

92,539 zapytań

141,382 odpowiedzi

319,479 komentarzy

61,928 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...