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

Dynamiczna tablica stringow

Object Storage Arubacloud
0 głosów
9,185 wizyt
pytanie zadane 28 czerwca 2015 w C i C++ przez Raba_Ababa Początkujący (390 p.)
Witam. Chcę stworzyć dynamiczną tablicę stringów. Z tego co wiem stworzenie tablicy family[10][200] pozwoli mi na stworzenie 10 stringow z czego każdy może mieć max 200 znakow. Problem pojawia się wtedy gdy do zapisu family[T][dynamiczna_ilość_każdego_słowa]:

1. Chcę, aby każdy T napis nie musiałbyć z góry przeze mnie deklarowany ile ma mieć znaków.

2. Jak mam w pętli wpisać każdy napis?

Z góry dzięki za pomoc. :)

4 odpowiedzi

+2 głosów
odpowiedź 28 czerwca 2015 przez kovi29 Obywatel (1,200 p.)
Moim zdaniem wystarczy tablicę zdefiniować jako:

string family[10];

...do każdego indeksu tablicy będziesz mógł wpisać dowolnie długi tekst gdyż klasa string ma to do siebie że jest sama w sobie inteligentna i alokuje sobie miejsce... jak się nie mylę to tak jest...
komentarz 28 czerwca 2015 przez Raba_Ababa Początkujący (390 p.)
Z takim rozwiązaniem, myślę, że miałbym problem z operacjami na poszczególnych indeksach wyrazów. Nie mógłbym się dostać do poszczególnych liter każdego wyrazu, z tego co wiem.
+2 głosów
odpowiedź 28 czerwca 2015 przez Buby Pasjonat (19,590 p.)

Kolega mówi o klasycznych napisach znanych z języka C.

Otóż jeśli chcesz uzyskać efekt, który opisałeś zadeklaruj sobię tablicę wskaźników, w których następnie zaalokujesz pamięć. Przykład:

#include <iostream>
#include <cstring>

int main( void )
{
    char* m_Words[10]; // Tablica 10 wskaznikow w ktorych bedziemy alokowac pamiec

    /* Pobranie 10 wyrazow */
    for( int i = 0; i < 10; ++i )
    {
        char temp[80];
        std::cin.getline(temp, 80);
        m_Words[i] = new char[std::strlen(temp)];
        std::strcpy( m_Words[i], temp );
    }

    /* Wypisanie */
    for( int i = 0; i < 10; ++i )
        std::cout << m_Words[i] << std::endl;

    return 0;
}

 

+2 głosów
odpowiedź 28 czerwca 2015 przez daan Pasjonat (17,640 p.)

Jeżeli T jest stałą to wystarczy taka deklaracja : 

string tab[T];

Jeżeli T jest zmienną, która będzie znana dopiero w momencie np. gdy użytkownik ją poda to powinieneś zrobić tablice dynamiczną a najłatwiej i najbezpieczniej będzie użyć np. vectora :

vector<string> tab;

tab.resize(T); // zmiana rozmiaru tablicy
tab.push_back(string) // dodanie do tablicy nowego stringa 

Jeżeli chodzi o to ile string może mieć znaków, nie musisz się tym martwić. Klasa string jest kontenerem i sama sobie alokuje potrzebną pamięć. (działa podobnie do np. klasy vector).

Wczytywanie stringa w pętli można zrobić np. tak :

for(int i = 0; i < T; ++i)
{
       string tmp;
       getline(cin, tmp);
       tab.push_back(tmp);
}

Należy użyć getline, ponieważ cin, wczytuje tylko ciąg znaków do momentu napotkania znaku białego (czyt. spacji).

komentarz 30 czerwca 2015 przez Raba_Ababa Początkujący (390 p.)
edycja 30 czerwca 2015 przez Raba_Ababa

Wygląda dla mnie to na dość elegancki sposób.Z vektorem nie miałem wcześniej styczności i mam problem. Czemu gdy wpisuję moje T(wpisuję za T=1), a następnie pierwszy dowolny napis do vectora, to funkcja size() wywala mi "2"? 

int main()
{
    int T; cin>>T;
    string x;
    vector <string> tab;
    tab.resize(T);
    cin>>x;
    tab.push_back(x);
    cout<<tab.size()
    return 0;
}

 

komentarz 30 czerwca 2015 przez daan Pasjonat (17,640 p.)

troche nie jasno to napisałem :D wybacz. vector.resize zmienia ilość elementów z których składa się vector czyli jak zrobisz resize(1), to w tym vectorze zostanie utworzony już pusty string, robiąc push_back dodajesz do niego nowy string, a wiec w efekcie są 2 :)

tab.resize(10);
tab[0] = "cos";
tab[9] = "cos 2";
// tutaj vector ma 10 elementow
tab.push_back("cos 3");
// tutaj juz ma 11

 

komentarz 30 czerwca 2015 przez Raba_Ababa Początkujący (390 p.)

Już jakoś doszedłem do tego co chciałem np bez funkcji push_back. Nie za bardzo rozumiem jak ona ma działać. Myślę, że tkwi to w myleniu przeze mnie niektórych pojęć.

1.Czy to co ja zrobiłem, to jest "tablica napisów" zrobiona za pomocą vektorów. 2.I czy będę miał z tym problemy, jeżeli będe chciał pracować na poszczególnych napisach? 3.Co robi/Jak się zachowuje vektor w tym moim zapisie?4. Czy dam rade teraz w jakiś sposób dostać się do poszczególnego indeksu każdego wyrazu(główne pytanie)? Z góry dzięki, bardzo pomogłeś.


int main()
{
    int T; cin>>T;
    vector <string> tab;
    tab.resize(T);
    for (int i=0;i<T;i++)
    {
    string x;
    cin>>x;
    tab[i]=x;
    }
    cout<<tab.size();
    return 0;
}

 

+1 głos
odpowiedź 28 czerwca 2015 przez jegor377 Stary wyjadacz (13,230 p.)

to nie char. Tutaj deklarujesz obiekty, a nie znaki, a  ty robisz tablicę kwadratową obiektów...

1 . Rozmiaru nie zadeklarujesz, ale możesz sprawdzać rozmiar i ewentualnie usuwać kawałek (funkcje length()).

 

2 . cin>>jakis_string;

 

jakis_string = "tekst";

 

jakis_string.length() - rozmiar stringu...

 

Jak chcesz zadeklarować z rozmiarem, to deklarujesz char'a... Np. char * family[200];

 

A to co chciałeś zrobić, to robisz tak:

 

char ** family = new char*[10];
for(int a=0; a<=9; a++) family[a] = new char[200];

family[5] = "tekst";

I wuala ;)

Podobne pytania

0 głosów
1 odpowiedź 160 wizyt
pytanie zadane 19 kwietnia 2021 w C i C++ przez MrChick888 Obywatel (1,020 p.)
0 głosów
1 odpowiedź 189 wizyt
0 głosów
1 odpowiedź 238 wizyt
pytanie zadane 21 sierpnia 2019 w C i C++ przez amtrax Dyskutant (9,630 p.)

92,555 zapytań

141,403 odpowiedzi

319,560 komentarzy

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

...