wyświetlanie łańcucha na który wskazuje wskańnim umieszczony w polu struktury

0

Witam,

Mam strukturę która w 1 polu zawiera wskaźnik na łańcuch

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

mam tez funkcje show która ma wyświetlić łańcuch zadana ilość razy

void show(stringy & rstruct, const int n)
{
	char *ps2 = rstruct.str;
	
	cout << "\nZawartosc (1) struktury to: \n" << endl;
	for (int i = 0; i < n; i++)
	{
		
		cout << "Test A: " << ps2 << endl;                       // zwraca śmieci zamiast wartości łańcucha
		cout << "Test A-2: " << rstruct.str << endl;           // zwraca śmieci zamiast wartości łańcucha

	}

}

lancuch wyglada nastepujaco:

char testing[] = "Rzeczywistosc to juz nie to, co kiedys.";

jak mogę wyświetlić wartość tego łańcucha ?

0

A gdzie przypisujesz łańcuch do obiektu typu stringy, który wyświetlasz?

https://stackoverflow.com/help/mcve

0

w odrębnej funkcji set:

void set(stringy & rstruct, char * pstring)
{
	char * ps = new char;			
	rstruct.str = ps;
	ps = pstring;
	rstruct.ct = strlen(ps);
	cout << "\n ct = " << rstruct.ct << endl;
	cout << " test sprawnosci set: "<< ps << endl;
	
}
2

Twoja funkcja set nie działa tak, jak tego oczekujesz. Alokujesz pamięć na jeden znak. Pomijając już zbrodnię w postaci użycia nagiego new ( https://dsp.krzaq.cc/post/176/ucze-sie-cxx-kiedy-uzywac-new-i-delete/ ). Przypisujesz wskaźnik ps do str. Po czym zmieniasz wartość oryginalnego wskaźnika ps, pozostawiając str niezmodyfikowane.

Lekko analogicznie:

int a = 42;
int b = a;
a = 0;

oczekujesz, że b = 0,

0

zadanie jest z podręcznika i te kombinacje z alokacja albo są czysto ćwiczeniowe albo ja je źle zinterpretowałem:

wytyczne do funkcji set:
pierwszy parametr jako referencja,
alokacja pola str struktury beany tak, aby wskazywała nowy blok,
kopiowanie testing do nowego bloku,
ustawienie pola ct zmiennej beany.
set() powinno korzystać z new do alokowania pamięci

funkcja set przyjmuje cały łańcuch (testowo go wyświetliłem w funkcji set)

cały kod wygląda następująco:

// zad_8_4.cpp - (178) - zadanie 4 z rodzialu 8 

#include <iostream>
#include <string>
#include <cstring>

using namespace std;

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

void set(stringy & rsturct, char * pstring);

void show( stringy & rstruct, const int n = 1);

void show(const char * pstring, int n = 1);

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

	set(beany, testing);

	show(beany);		// pokazuje napis tylko raz
	show(beany, 2);		// pokazuje napis x2

	testing[0] = 'D';	
	testing[1] = 'u';

	show(testing);		// pokazuje lancuch testing tylko raz
	show(testing, 3);	// pokazuje lancuch testing 3x
	show("Gotowe!");
		
	cin.get();
	return 0;
}

void set(stringy & rstruct, char * pstring)
{
	char * ps = new char;			
	rstruct.str = ps;
	ps = pstring;
	rstruct.ct = strlen(ps);
	cout << "\n ct = " << rstruct.ct << endl;
	cout << " test sprawnosci set: "<< ps << endl;
	
}

void show(stringy & rstruct, const int n)
{
	char *ps2 = rstruct.str;
	
	cout << "\nZawartosc (1) struktury to: \n" << endl;
	for (int i = 0; i < n; i++)
	{
		
		cout << "Tekst A: " << ((ps2)) << endl;
		cout << "Tekst A-2: " << (rstruct.str) << endl;

	}

}

void show(const char * pstring, int n)
{
	cout << "Zawartosc (2) lancucha to: \n" << endl;
	for (int i = 0; i < n; i++)
	{
		cout << "Tekst B: " << pstring << endl;
	}
	cout << endl;
}
0
    rstruct.str = ps;
    ps = pstring;

modyfikacja ps nie wpływa na str.

0

to jak powinien powiązać wskaźniki żeby móc sięgnąć do łańcucha przez wskaźnik ze struktury ?

rozumiem ze alokować powinienem przez new z [tu_długośc _łańcucha]

1
ps = pstring;
rstruct.str = ps;

albo po prostu

rstruct.str = pstring

btw: wywal tego new, tylko wyciek pamięci robisz.

0

jeszcze jedno pytanie, a jeżeli chciałbym zostawić new to gdzie powinienem dać delete ?
wewnątrz funkcji set() czy pod koniec programu ?

0

Najepiej nigdzie, zgodnie z tym co wyżej podlinkowałem. Jak już musisz użyć new/delete to najlepiej usuwaj w destruktorze obiektu, odpowiedzialnego za ten napis.

1
void set(stringy& rstruct, char *pstring)
{
    size_t pstring_len = strlen(pstring);
     rstruct.str = new char[pstring_len + 1];           
    strcpy(rstruct.str, pstring);
}

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