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

Tablica służąca za słownik

Object Storage Arubacloud
+1 głos
330 wizyt
pytanie zadane 27 grudnia 2021 w C i C++ przez MKolaj15 Bywalec (2,270 p.)

Witam, mam do napisania program, w którym tablica typu std::string będzie przechowywała słowa niczym słownik. Na razie muszę napisać funkcję, która będzie dodawać słowo do tablicy oraz funkcję, która wypisze zawartość tablicy. Oto mój kod:

#include <iostream>
#include <string>

void dodaj(std::string s[5000], std::string str)
{
        bool t;
        for (int i = 0; i < 5000; i++) {                      // sprawdzanie, czy istnieje juz takie slowo
            if (str != s[i]) {
                t = true;
            } else {
                t = false;
            }
        }
 
        if (t) {                     
            for (int i = 0; i < 5000; i++) {                 // jesli nie istnieje znajdz pusta wartosc tablicy i wpisz tam slowo
                if (s[i] == " ") {
                        s[i] = str;
                } else {
                        std::cout<<"koniec miejsca w tablicy"<<std::endl;
                }

            }
        } else {                                                            
            std::cout << "Istnieje juz takie slowo" << std::endl;
        }
}

void wypisz(std::string s[5000])
{
        for (size_t i = 0; i <5000; i++ ) {
                std::cout<<s[i]<<std::endl;
        }
}

auto main() -> int
{
        std::string slownik[5000];
        dodaj(slownik,"kot");

        wypisz(slownik);

return 0;
}

Nie jestem pewien, czy tak sprawdza się nieużyte miejsce w tablicy oraz chciałbym się dowiedzieć, czy jest jakiś sposób, aby funkcja 'wypisz' wypisywała tylko "zajęte" pola tablicy. Z góry dziękuję za rady!

1 odpowiedź

+2 głosów
odpowiedź 28 grudnia 2021 przez j23 Mędrzec (194,920 p.)
Zrób zmienną, która będzie trzymać ilość słów w tablicy i przekazuj ją to funkcji, które korzystają z tej tablicy. Prościej się nie da.
komentarz 28 grudnia 2021 przez MKolaj15 Bywalec (2,270 p.)
edycja 28 grudnia 2021 przez MKolaj15

Okej, rozumiem, że w tym celu mam utworzyć tablicę dynamiczną. Tak właśnie zrobiłem i zmodyfikowałem trochę mój kod, lecz po próbie uruchomienia wyrzuca: (Edit)

malloc.c:2401: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed.
Aborted (core dumped)

#include <iostream>
#include <string>

void dodaj(std::string s[], int& n, const std::string& str)
{
        bool t;
        for (int i = 0; i <= n; i++) {
            if (str != s[i]) {
                t = true;
            } else {
                t = false;
            }
        }
 
        if (t) {
                n++;
                s[n] = str;
        } else {
            std::cout << "Istnieje juz takie slowo" << std::endl;
        }
}

void wypisz(std::string s[], int& n)
{
        for (int i = 0; i <= n; i++) {
                std::cout<<s[i]<<std::endl;
        }
}

auto main() -> int
{
        int n = 0;
        std::string * slownik = new std::string[n];

        dodaj(slownik, n, "kot");

        wypisz(slownik, n);


return 0;
}

Wiesz może co robię źle i mógłbyś mi podpowiedzieć co zmienić?

2
komentarz 28 grudnia 2021 przez j23 Mędrzec (194,920 p.)
edycja 29 grudnia 2021 przez j23

Tworzysz tablicę o rozmiarze zero, a dobierasz się do niej, jakby miała te wcześniejsze 5000 elementów. To nie może działać.

Normalnie odesłałbym Cię do klasy std::vector, która załatwia sprawę dynamicznych tablic, ale jeśli to musi być tablica dynamiczna, to:

#include <iostream>
#include <string>
#include <algorithm>
 
void dodaj(std::string* &s, unsigned int& n, std::string str)
{
    if(std::find(s, s + n, str) != (s + n)) {
        std::cout << "Istnieje juz takie slowo\n";
        return;
    }
    
    std::string* new_s = new std::string[n + 1]; // tworzę nową tablicę o 1 większą
    std::move(s, s + n, new_s); // przenoszę zawartość starej do nowej
    new_s[n++] = std::move(str);
    
    delete[] s; // usuwam starą tablicę
    s = new_s;
}
 
void wypisz(std::string s[], unsigned int n)
{
        for (int i = 0; i < n; i++) {
                std::cout<<s[i]<<std::endl;
        }
}
 
int main()
{
    unsigned int n = 0;
    std::string * slownik = nullptr;

    dodaj(slownik, n, "kot");
    wypisz(slownik, n);
    
    delete[] slownik;
    return 0;
}

 

komentarz 28 grudnia 2021 przez MKolaj15 Bywalec (2,270 p.)

Super, dzięki za pomoc, chyba wszystko rozumiem, ale wiesz może czemu po wypisaniu zawartości tablicy, wywala też

Segmentation fault (core dumped)

2
komentarz 29 grudnia 2021 przez j23 Mędrzec (194,920 p.)
W pętli wypisującej był (twój) błąd, którego nie wyłapałem. Poprawione.
komentarz 29 grudnia 2021 przez MKolaj15 Bywalec (2,270 p.)
Bardzo dziękuję za pomoc!
komentarz 30 grudnia 2021 przez MKolaj15 Bywalec (2,270 p.)
edycja 30 grudnia 2021 przez MKolaj15
edit: problem rozwiązany

Podobne pytania

0 głosów
2 odpowiedzi 334 wizyt
pytanie zadane 29 listopada 2020 w PHP przez Igorek Mądrala (6,290 p.)
0 głosów
2 odpowiedzi 290 wizyt
0 głosów
1 odpowiedź 145 wizyt

92,572 zapytań

141,423 odpowiedzi

319,645 komentarzy

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

...