Wpisanie tekstu do tablicy char tablic obiektu

Wpisanie tekstu do tablicy char tablic obiektu
N3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 420
0
Kopiuj
#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:

Kopiuj
strcpy(stacyjka[0].nazwa[0],"abc"); 
kaczus
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Łódź
  • Postów: 1403
1

albo

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

albo

Kopiuj
strcpy(stacyjka[0].nazwa,"abc");  
N3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 420
0

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

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

to przy wyświetlaniu

Kopiuj
stacyjka[0].nazwa[1] 

wyświetla się tylko litera a.

kaczus
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Łódź
  • Postów: 1403
1

bo wtedy wyświetlic trzeba

Kopiuj
 &stacyjka[0].nazwa[1]  
N3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 420
0

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

Kopiuj
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;
kaczus
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Łódź
  • Postów: 1403
1

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

Kopiuj
&wsk->nazwa[1] 
N3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 420
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:

Kopiuj
#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;
}
 
kaczus
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Łódź
  • Postów: 1403
1

jakbyś miał

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

to

Kopiuj
 
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

N3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 420
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:

Kopiuj
#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.

N3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 420
0

zamieniłem ifa na:

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

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

twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
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?

kaczus
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Łódź
  • Postów: 1403
0
Kopiuj
 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.

N3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 420
0

teraz zamieniłem ifa na takie coś:

Kopiuj
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.

kaczus
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Łódź
  • Postów: 1403
1

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

N3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 420
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 ?

Kopiuj
#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;
}
 
kaczus
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Łódź
  • Postów: 1403
1

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

Kopiuj
 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;
N3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 420
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.

Kopiuj
 stacja_metra *wsk = new stacja_metra[15];
    cout << &wsk << endl;
    wsk = wsk + 8;
    wsk->glebokosc = 10;
    cout << &wsk << endl;
kaczus
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Łódź
  • Postów: 1403
0

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

N3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 420
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 ?

kaczus
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Łódź
  • Postów: 1403
0

Stary nie przepada, tylko nigdzie nie jest pamietany.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.