Zadanko ze strukturami, referencjami i wskaźnikami – coś zrobiłem nie tak?

0

Hej, mam problem z zadankiem. Dostałem szkielet funkcji który miałem pouzupełniać. Jakby nie patrzeć nie wykonałem jeszcze całego zadania, ale po drodze chciałem sprawdzić czy to co wykonałem działa jak należy. Program się skompilował, jednak nie wyświetla mi nic i jego działanie się kończy. Ogólnie to co ja pododawałem to deklaracje i definicje funkcji w celu dopasowania ich do main. Miałem jeszcze użyć new w funkcji set(), oraz wykonać instrukcje z zakomentowań. Mogę prosić o pomóc we wskazaniu co zrobiłem do tej pory źle?

#include <iostream>
#include <cstring>

using namespace std;

struct stringy
{
    char * str; //wskazuje lancuch
    int ct; //dlugosc lancucha bez /0
};

void set(stringy & stru, char *word);
void show(const stringy &str, int i = 1);
void show(char *word1, int i = 1);

int main()
{
    stringy beany;
    char testing[] = "Rzeczywistosc to juz nie to co kiedys";

    set(beany, testing); //Pierwszy parametr to referencja
    //alokacja pamieci na wynik sprawdzania
    //ustawianie pola str struktury beany tak by wskadzywala nowy blok
    //kopiowanie testing do nowego bloku
    //ustawienie pola ct zmiennej beany
    show(beany); //pokazuje napis raz
    show(beany, 2); // pokazuje napis 2 razy
    testing[0] = 'D';
    testing[1] = 'u';
    show(testing); //pokazuje lancuch raz
    show(testing, 3); // pokazuje lancuch x3
    show("Gotowe");
    system("pause");

    return 0;
}

void set(stringy & stru, char *word)
{
    strcpy(stru.str, word);
}

void show(const stringy &str, int i)
{
    for (int x = i; x > 0; x--)
    {
        cout << str.str <<endl;
    }
}

void show(char *word1, int i)
{
    for (int x = i; x > 0; x--)
    {
        cout << word1 << endl;
    }
}
1

U mnie strcpy sypało jakieś błędy, może u Ciebie też z tym coś nie grało. Tak czy siak po takiej modyfikacji seta wszystko działa tak jak powinno według Twojego opisu.

void set(stringy & stru, char *word)
{
    stru.str = word;
}
0

Dzięki wielkie. Pomogło :)

4

Pozwolę sobie dorzucić coś od siebie, mimo, że jest już zaakceptowana odpowiedź (błędna btw).

#include <iostream>
#include <cstring>

using namespace std;

struct stringy
{
    char * str;
    int ct;
};

void set(stringy & stru, char *word);
void show(const stringy &str, int i = 1);
void show(char *word1, int i = 1);

int main()
{
    stringy beany;
    char testing[] = "Rzeczywistosc to juz nie to co kiedys"; // Lipton: https://dev.krzaq.cc/post/stop-assigning-string-literals-to-char-star-already/

    set(beany, testing); 
    show(beany);
    show(beany, 2);
    testing[0] = 'D'; // UB, zmiana constowego obiektu
    testing[1] = 'u';// UB, jak wyżej
    show(testing);
    show(testing, 3);
    show("Gotowe");
    system("pause");

    return 0;
}

void set(stringy & stru, char *word)
{
    // 1. Nie zwalniasz pamięci, na którą wskazuje stru.str
    // 2. Nie alokujesz pamięci, która pomieści word
    strcpy(stru.str, word);
}

// To ta błędna odpowiedź
void set2(stringy & stru, char *word)
{
    stru.str = word; // kopiowanie samych wskaźników, nie łańcuchów
}

void show(const stringy &str, int i)
{
    // Mógłbyś wywołać show(str.str, i)
    for (int x = i; x > 0; x--)
    {
        cout << str.str <<endl;
    }
}

 // niech word będzie const char*
void show(char *word1, int i)
{
    for (int x = i; x > 0; x--)
    {
        cout << word1 << endl;
    }
}

Żeby nie było, że tylko wytykam, podpowiedź do set

struct stringy
{
    char * str{ nullptr };
    int ct{};
};
/*...*/
void set(stringy & stru, char *word)
{
    // 1. Zwolnij pamięć pod stru.str
    // 2. Zaalokuj strlen(word) + 1u znaków i zapisz wskaźnik po stru.str
    // 3. strcpy
}

No i na koniec. Otagowałeś C++. Niestety z C++ ten kod jak na razie ma wspólne tylko using namespace std; i cout. Jeżeli na prawdę chcesz to napisać w C++, poczytaj o metodach albo najlepiej std::string (chociaż pewnie tego akurat zabronili).

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