Skocz do zawartości
Leogict

[c++] Doklejanie Stringu Do Już Istniejącego

Rekomendowane odpowiedzi

Witam.

Napisałem program z Symfonii C++ Standard, wyd. 3 z 2008r, ćwiczenie XXIII/218, w skrócie: mamy napisać funkcję, która do końca stringu będącego w jednej tablicy dołączy string będący w innej tablicy, funkcja powinna przerwać w przypadku zapełnienia całej tablicy.

 

Jak zwykle będę wdzięczny za uwagi, spostrzeżenia, komentarze i wskazówki.

Ćwiczenie było po rozdziale o tablicach, więc nie piszcie o żadnych vectorach, klasach itp :)

 

#include <iostream>using namespace std;void dolacz(char docelowa[], int rozmiar_docelowej, char zrodlowa[]);int main(){	const int rozmiar=30;	// rozmiar tablicy docelowej	char tablica_docelowa[rozmiar]={"Czym sie rozni kaczka"};	char tablica_zrodlowa[]={" od labedzia?"};	dolacz(tablica_docelowa, rozmiar, tablica_zrodlowa);  // here we go;)	return 0;}//***********************************************************************//funkcja do dolaczania stringu z tablicy zrodlowej do tablicy docelowej://***********************************************************************void dolacz(char docelowa[], int rozmiar_docelowej, char zrodlowa[]){	int i=0,j=0,licznik_doc=0,licznik_zro=0;	while(docelowa[i++]) ++licznik_doc;		   //ilosc liter w tablicy docelowej, od tego indeksu zaczynamy doklejanie	while(zrodlowa[j++]) ++licznik_zro;		   //ilosc liter w tablicy zrodlowej	for(int i=licznik_doc; i<licznik_doc+licznik_zro; i++)	{		if(i>=rozmiar_docelowej) break;  // zapelniona cala tablica, przerywamy dzialanie funkcji		docelowa[i]=zrodlowa[i-licznik_doc];  // wlasciwe doklejanie	}}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

nie ma odpowiedzi do tych zadan z symfonii, zebys mogl sprawdzic jak to zostalo rozwiazane?

 

void dolacz(char docelowa[], int rozmiar_docelowej, char zrodlowa[]) {	int i=0,j=0;	while(docelowa[i]) i++;	while(zrodlowa[j] || (i < rozmiar_docelowej)){	  docelowa[i] = zrodlowa[j];	  i++;	  j++;	}}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie ma odpowiedzi, bo nie ma jednego pasującego rozwiązania, można to zrobić na wiele sposobów.

 

Twój kod wygląda ok, ale nie masz terminowania zerem w przypadku przepełnienia tablicy.

Mój kod poprawiony:

#include <iostream>using namespace std;void dolacz(char docelowa[], int rozmiar_docelowej, char zrodlowa[]);int main(){		const int rozmiar=30;	// rozmiar tablicy docelowej		char tablica_docelowa[rozmiar]={"Czym sie rozni kaczka"};		char tablica_zrodlowa[]={" od labedzia?"};		dolacz(tablica_docelowa, rozmiar, tablica_zrodlowa);  // here we go Wink		return 0;}//***********************************************************************//funkcja do dolaczania stringu z tablicy zrodlowej do tablicy docelowej://***********************************************************************void dolacz(char docelowa[], int rozmiar_docelowej, char zrodlowa[]){		int i=0,j=0,licznik_doc=0,licznik_zro=0;		while(docelowa[i++]) ++licznik_doc;		   //ilosc liter w tablicy docelowej, od tego indeksu zaczynamy doklejanie		while(zrodlowa[j++]) ++licznik_zro;		   //ilosc liter w tablicy zrodlowej		for(int i=licznik_doc; i<licznik_doc+licznik_zro; i++)		{				if(i>=rozmiar_docelowej)								{										docelowa[i-1]=0;  // terminowanie zerem w przypadku przedwczesnego zapełnienia tablicy										break;  // zapelniona cala tablica, przerywamy dzialanie funkcji								}				docelowa[i]=zrodlowa[i-licznik_doc];  // wlasciwe doklejanie		}}
Edytowane przez Leogict

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie ma odpowiedzi, bo nie ma jednego pasującego rozwiązania, można to zrobić na wiele sposobów.

 

Twój kod wygląda ok, ale nie masz terminowania zerem w przypadku przepełnienia tablicy.

w takim razie co jesli tablica docelowa nie bedzie pelna? (:

 

Mój kod poprawiony:

chodzilo mi raczej o optymalizacje przez redukcje zbednych warunkow

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

w takim razie co jesli tablica docelowa nie bedzie pelna? (:

To if się nie wykona.

 

Twoje rozwiązanie wygląda ok, tylko to terminowanie zerem jak mamy przepełnienie, dzięki. Piszcie dalej.

Edytowane przez Leogict

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Zawsze, ale jak nie ma przepełnienia, to dokleja string źródłowy z NULL-em przecież, więc jest wszystko si.

 

Edit:

chociaż jak tak teraz patrzę pod debuggerem, to dokleja string źródłowy bez nulla, ale że tablica docelowa była wstępnie zainicjalizowana, to wszystko jest ok.

 

Drainer dzięki, miałeś rację, zwracam honor.

Teraz powinno kończyć zerem w każdym przypadku:

zmienna licznik_zro poprostu zliczała znaki w tablicy źródłowej bez uwzględnienia nulla, stąd to niedopatrzenie. :)

#include <iostream>using namespace std;void dolacz(char docelowa[], int rozmiar_docelowej, char zrodlowa[]);int main(){		const int rozmiar=30;	// rozmiar tablicy docelowej		char tablica_docelowa[rozmiar]={"Czym sie rozni kaczka"};		char tablica_zrodlowa[]={" od labedzia?"};		cout << tablica_docelowa;		dolacz(tablica_docelowa, rozmiar, tablica_zrodlowa);  // here we go Wink		cout << endl << tablica_docelowa << endl;		return 0;}//***********************************************************************//funkcja do dolaczania stringu z tablicy zrodlowej do tablicy docelowej://***********************************************************************void dolacz(char docelowa[], int rozmiar_docelowej, char zrodlowa[]){		int i=0,j=0,licznik_doc=0,licznik_zro=0;		while(docelowa[i++]) ++licznik_doc;		   //ilosc liter w tablicy docelowej, od tego indeksu zaczynamy doklejanie		while(zrodlowa[j++]) ++licznik_zro;		   //ilosc liter w tablicy zrodlowej		for(int i=licznik_doc; i<licznik_doc+licznik_zro+1; i++)		{				if(i>=rozmiar_docelowej)								{										docelowa[i-1]=0;  // terminowanie zerem w przypadku przedwczesnego zapełnienia tablicy										break;  // zapelniona cala tablica, przerywamy dzialanie funkcji								}				docelowa[i]=zrodlowa[i-licznik_doc];  // wlasciwe doklejanie		}}
Edytowane przez Leogict

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...