Wpisanie tekstu do tablicy char tablic obiektu

0
#include <iostream>
using namespace std;

class stacja_metra
{
public:
    double km;
    int glebokosc;
    char nazwa[40];
    char przesiadki[80];
};

int main()
{

    stacja_metra stacyjka[15];
    stacyjka[0].nazwa[0] = "ad";
    stacyjka[1].km = 77;

    cout << stacyjka[0].nazwa[0]  << endl << stacyjka[1].km << endl;

    return 0;
}
 

Dla tablicy string normalnie tak działa, dla tablicy char występuje błąd: incompatible types in assignment of char* to char.

Próbowałem jeszcze tak:

strcpy(stacyjka[0].nazwa[0],"abc"); 
1

albo

strcpy(&stacyjka[0].nazwa[0],"abc");  

albo

strcpy(stacyjka[0].nazwa,"abc");  
0

A jak dla stacyjka[0] chcę przypisać wartość do nazwa[1] to można tak ? Bo jeśli napiszę:

strcpy(&stacyjka[0].nazwa[1],"abc"); 

to przy wyświetlaniu

stacyjka[0].nazwa[1] 

wyświetla się tylko litera a.

1

bo wtedy wyświetlic trzeba

 &stacyjka[0].nazwa[1]  
0

A jeśli przez wskaźnik chcę wyświetlić nazwa[1] to czemu taki zapis jest nie poprawny ? Wyświetla tylko literę a

stacja_metra stacyjka[15];
    stacja_metra *wsk = &stacyjka[1];

    strcpy(&stacyjka[1].nazwa[1],"abc");

    stacyjka[1].km = 77;

    cout << wsk->nazwa[1] << endl << wsk->km << endl;
1

dokładnie z tego samego powodu co wyżej - winno być:

&wsk->nazwa[1] 
0

Próbuje teraz napisać prostym program ,ale coś źle wyświetlają mi się dane. Polega na tym, że sprawdza czy dana stacja ma przesiadki:

#include <iostream>
#include <cstring>
using namespace std;

class stacja_metra
{
public:
    double km;
    int glebokosc;
    char nazwa[40];
    char przesiadki[80];
};

int main()
{
    stacja_metra stacyjka[15];

    strcpy(stacyjka[0].nazwa,"Polska");
    strcpy(stacyjka[1].nazwa,"Niemcy");
    strcpy(stacyjka[2].nazwa,"Rosja");

    strcpy(stacyjka[0].przesiadki,"Kolobrzeg");
    strcpy(&stacyjka[0].przesiadki[1],"Warszawa");
    strcpy(&stacyjka[0].przesiadki[2],"");

    strcpy(stacyjka[1].przesiadki,"");
    strcpy(&stacyjka[1].przesiadki[1],"");
    strcpy(&stacyjka[1].przesiadki[2],"");

    strcpy(stacyjka[2].przesiadki,"");
    strcpy(&stacyjka[2].przesiadki[1],"");
    strcpy(&stacyjka[2].przesiadki[2],"");



    for(int i = 0; i < 3; ++i)
    {
        cout << stacyjka[i].nazwa << endl;
        for(int j = 0; j < 3; ++j)
        {
            if(&stacyjka[i].przesiadki[j])
            {
                cout << "Przesiadki: " << &stacyjka[i].przesiadki[j] << endl;
            }
            else
            {
                cout << "Brak przesiadek" << endl;
            }
        }
    }

    return 0;
}
 
1

jakbyś miał

 
    strcpy(stacyjka[2].przesiadki,"ala");
    strcpy(&stacyjka[2].przesiadki[1],"ela");
    strcpy(&stacyjka[2].przesiadki[2],"ola");

to

 
cout<<stacyjka[2].przesiadki<<endl;
cout<<&stacyjka[2].przesiadki[1]<<endl;
cout<<&stacyjka[2].przesiadki[2]<<endl;

wypisze nam:

aeola
eola
ola

bo nadpisujesz sobie dane. Ty chyba potrzebujesz na przesiadki tablicę stringów, a nie jeden string

0

rozumiem jaki błąd już popełniam. Źle rozumiałem tablice char[40], oznacza to, że w tablicy jest 40znaków a nie 40 różnych elementów typu char. Pomyliłem jakby to była tablica stringów.Poprawione na tablicach char:

#include <iostream>
#include <cstring>
using namespace std;

class stacja_metra
{
public:
    double km;
    int glebokosc;
    char nazwa[40];
    char przesiadki[80];
};

int main()
{
    stacja_metra stacyjka[15];

    strcpy(stacyjka[0].nazwa,"Polska");
    strcpy(stacyjka[1].nazwa,"Niemcy");
    strcpy(stacyjka[2].nazwa,"Rosja");

    strcpy(stacyjka[0].przesiadki,"Kolobrzeg");

    strcpy(stacyjka[1].przesiadki,"");

    strcpy(stacyjka[2].przesiadki,"");

    for(int i = 0; i < 3; ++i)
    {
        cout << stacyjka[i].nazwa << endl;
            if(stacyjka[i].przesiadki != "")
            {
                cout << "Przesiadki: " << stacyjka[i].przesiadki << endl;
            }
            else
            {
                cout << "Brak przesiadek" << endl;
            }
        }


    return 0;
}
 

lecz mnie zastanawia czemu jak mam w stacyjka[1].przesiadki wartość "" to nie wypisuje mi brak przesiadek, tylko spełnia pierwszego ifa.

0

zamieniłem ifa na:

if(strcmp(stacyjka[i].przesiadki,"") != 0)

można to zrobić jakoś prościej na tablicach char ?

1

Bo tablica znaków to nie jest std::string, więc nie można używać !=. Zamiast tego musisz używać strcmp, tak jak zamiast zwykłego przypisania musisz użyć strcpy.

jest 40znaków a nie 40 różnych elementów typu char
Że jak? Jaka jest różnica między 40 znakami a 40 elementami typu znak?

0
 if(stacyjka[i].przesiadki != "") 

jest złe
"stringi" jako char * porównujemy za pomoca funkcji strcmp.
a jeśli chcemy sprawdzić, czy w ogóle coś jest wpisane to strlen(stacyjka[i].przesiadki) przyrównujemy do 0 - jeśli równe 0, to jest puste, jeśli większe od 0, to coś jest w środku.

0

teraz zamieniłem ifa na takie coś:

if(strcmp(stacyjka[i].przesiadki,"")) 

ten warunek powinien być spełniony jeśli w przesiadkach nic nie ma. W programie jest na odwrót i tam gdzie mam przesiadkę spełnia tego ifa.

1

strcmp zwraca 0 jeśli ciągi sa sobie równe.

0

Dlaczego w tym przypadku mimo, że wskaźnik ustawiłem na 8 element tablicy stacja_metra to później pole głebokość zapisuje do pierwszego elementu tablicy stacja_metra ?

#include <iostream>
#include <string>
using namespace std;

class stacja_metra
{
public:
    double km;
    int glebokosc;
    string nazwa[40];
    string przesiadki[80];
};

int main()
{
    stacja_metra *wsk = new stacja_metra[15];
    wsk = wsk + 8;
    wsk->glebokosc = 10;

    cout << wsk[0].glebokosc << endl << wsk[1].glebokosc << endl;

    return 0;
}
 
1

zapisuje do 8, tylko straciłeś wskazanie ne pierwszy i juz będzie wyciek pamięci

 stacja_metra *wsk1 = new stacja_metra[15];
    stacja_metra *wsk = wsk1 + 8;
    wsk->glebokosc = 10;
 
    cout << wsk[0].glebokosc << endl << wsk[8].glebokosc << endl;
   delete []wsk1;
0

a w moim przykładzie na pewno przesunąłem wskaźnik o 8 pozycji dalej ? bo jak wyświetlam adresy wskaźnika to ciągle taki sam wyświetla.

 stacja_metra *wsk = new stacja_metra[15];
    cout << &wsk << endl;
    wsk = wsk + 8;
    wsk->glebokosc = 10;
    cout << &wsk << endl;
0

nie wyświetlasz adresu na co wskazuje wskaźnik, tylko adres miejsca gdzie przechowywany jest ten adres.

0

To tak jakby miałem wskaźnik pokazujący na element tablicy o indeksie 0, potem przesunąłem go o 8 pozycji, więc ten nowy wskaźnik pokazuje tak jakby teraz na zerowy element tablicy,ale w rzeczywistości na 8 element starego wskaźnika a tamten stary pzepada ?

0

Stary nie przepada, tylko nigdzie nie jest pamietany.

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