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

Błąd w programie

Object Storage Arubacloud
0 głosów
272 wizyt
pytanie zadane 16 października 2017 w C i C++ przez Sic Dyskutant (8,510 p.)

Witam pisałem program który ma wpisać ilość samochodów skatalogowania, następnie wypisać ich dane(nazwe, i rok produkcji). Szukam błędu w pętli.

#include <iostream>

int main()
{
    struct salon
    {
        char nazwa[25];
        int rok;
    };

    int ilosc;
    std::cout << "Ile samochodow do skatalogowania: ";
    std::cin >> ilosc;
    salon car;
    for(int i=0; i < ilosc; i++)
        {
            std::cin.get(car.nazwa, i);
            std::cin >> car.rok;
        }//for

    std::cout << "Marka: "<< car.nazwa[25] << "\nRok produkcji: " << car.rok << std::endl;
    std::cin.get();
    return 0;
}

 

5 odpowiedzi

+1 głos
odpowiedź 16 października 2017 przez Patryk Krajewski Nałogowiec (26,170 p.)
Na początek tworzysz obiekt car, potem kilka razy coś do niego przypisujesz, a następnie wypisujesz 25 znak jego nazwy. Przemyśl ten kod. I używaj std::string zamiast tablicy charów
+1 głos
odpowiedź 16 października 2017 przez Dexterim Dyskutant (8,370 p.)
Deklaracje struktury powinieneś raczej wyrzucić poza maina. Popatrz jak działa u Cb funkcja cin::get(gdzie ma wstawić, ile znaków) w Twoim przypadku zaczynasz od 0. Poza tym jesli chcesz miec kilka samochodów to musisz utworzyć tablice struktur. W innym przypadku caly czas nadpisujesz to co miałes. Dalej idąc poza petla chcesz wyprintowac car.nazwa[25] co jest wyjściem poza tablice.
+1 głos
odpowiedź 16 października 2017 przez obl Maniak (51,280 p.)

Chcesz wczytać ileś tam samochodów do bazy danych a tworzysz miejsce tylko na jeden rekord tej bazy:

salon car;

To po pierwsze, po drugie nie rozumiesz najwyraźniej jak działa ta linijka:

std::cin.get(car.nazwa, i);

pierwszy argument metody get to zmienna, do której wczytane zostaną dane wpisane z klawiatury przez użytkownika. Natomiast i w tym przypadku oznacza ilość wczytanych znaków.

Poza tym w tej pętli ciągle nadpisujesz jeden i ten sam rekord co delikatnie mówiąc nie ma sensu.

Powinieneś utworzyć albo dynamicznie tablicę struktur salon albo wykorzystać kontener vector.

+1 głos
odpowiedź 17 października 2017 przez obl Maniak (51,280 p.)
edycja 17 października 2017 przez obl

To spróbuj tak:

#include <iostream>
#include <string>
 
struct salon
    {
        std::string nazwa;
        int rok;
    };
 
int main()
{
    int ilosc;
    std::cout << "Ile samochodow do skatalogowania: ";
    std::cin >> ilosc;
    salon * car = new salon[ilosc];
    for(int i=0; i < ilosc; i++)
        {
            std::cout << "\nPodaj marke: ";
			std::cin.ignore(1);
            //std::cin >> car[i].nazwa;    // dziala poprawnie
            std::getline(std::cin, car[i].nazwa); //nie mozna wpisac danych
            std::cout << "Podaj rok produkcji: ";
			std::cin >> car[i].rok;
        }//for
    std::cout << std::endl;
    for(int i=0; i < ilosc; i++)
        std::cout << "Marka: "<< car[i].nazwa << "\nRok produkcji: " << car[i].rok << std::endl;
	std::cin.ignore(1);
    std::cin.get();
    return 0;
}

Bo łapie ci ten znak nowej linii, więc go z bufora usuwasz za pomocą cin.ignore(1)

Zapomniałem dodać, że na koniec ładnie by było pamiętać o zwolnieniu dynamicznie przydzielonej pamięci.

komentarz 17 października 2017 przez Sic Dyskutant (8,510 p.)
Dziękuję nie znałem tej metody.

Tak zrobiłem zupełnie o tym zapomniałem.
0 głosów
odpowiedź 17 października 2017 przez Sic Dyskutant (8,510 p.)

Poprawiłem program według wytycznych. Dziękuję bardzo. Wszystko działa poprawnie, jednak przy wpisywaniu danych za pomocą std::cin, próbowałem zrobić to za pomocą std::cin.get() lub std::getline(), program nie pozwala na wpisanie tekstu. Dlaczego ?.


#include <iostream>
#include <string>

struct salon
    {
        std::string nazwa;
        int rok;
    };

int main()
{
    int ilosc;
    std::cout << "Ile samochodow do skatalogowania: ";
    std::cin >> ilosc;
    salon * car = new salon[ilosc];
    for(int i=0; i < ilosc; i++)
        {
            std::cout << "\nPodaj marke: ";
            std::cin >> car[i].nazwa;    // dziala poprawnie
            //std::getline(std::cin, car[i].nazwa); //nie mozna wpisac danych
            std::cout << "Podaj rok produkcji: ";
            std::cin >> car[i].rok;
        }//for
    std::cout << std::endl;
    for(int i=0; i < ilosc; i++)
        std::cout << "Marka: "<< car[i].nazwa << "\nRok produkcji: " << car[i].rok << std::endl;
    std::cin.get();
    return 0;
}
komentarz 17 października 2017 przez Huberti Gaduła (4,500 p.)

Ponieważ kod 

std::cin >> car[i].nazwa;

zostawia po sobie znak nowego wiersza, a linijka 

std::getline(std::cin, car[i].nazwa);

go wczytuje. Powinieneś wczytać ten znak np. za pomocą cin.get ();

komentarz 17 października 2017 przez Sic Dyskutant (8,510 p.)

próbowałem już tym sposobem:

std::cin.get(car[i].nazwa,25);

jednak cały czas pokazuje mi błąd sprawdzałem co on oznacza i dotyczy to parametrów.

komentarz 17 października 2017 przez Huberti Gaduła (4,500 p.)
std::cin.get(car[i].nazwa,25);

cin.get() pobiera zmienne typu char, a ty masz zdefiniowaną string. Musiałbyś zamienić zmienną nazwa na tablicę znaków. Ewentualnie możesz zapisać to tak:

std::cin>>nazwa;

lub jeżeli chcesz pobrać całą linię:

std::getline(cin,nazwa);

 

Podobne pytania

0 głosów
2 odpowiedzi 124 wizyt
pytanie zadane 27 listopada 2017 w C i C++ przez Sic Dyskutant (8,510 p.)
0 głosów
0 odpowiedzi 716 wizyt
pytanie zadane 30 kwietnia 2017 w C i C++ przez niezalogowany
0 głosów
2 odpowiedzi 299 wizyt

92,568 zapytań

141,421 odpowiedzi

319,629 komentarzy

61,956 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!

...