Zamiana ciągu znaków

0

Cześć, staram się nauczyć C++, na razie piszę najprostsze funkcję i uczę się wskaźników. Trafiłem na zadanie o podmianie ciągu znaków czyli:

a = "cos";
b = "nicanic";

i po wykonaniu metody wyświetlenie b powinno skutkować pojawieniem się ciągu "cos".

Pomyślałem, że warto byłoby wrzucić pierwszy wyraz do nowej tablicy, w tym czasie drugi uzupełnić zerami i na koniec podmienić zera na pierwszy wyraz, ale nie mam pojęcia jaką długość ma mój char *. Zresztą nie wiem czy byłoby to dozwolone. Głośno myślę.

Na początku próbowałem coś takiego:

	while (*b != '\0') {
		*b = *a;

		*b++;
		*a++;
	}

To działała... ale tylko w przypadku gdy podmieniany wyraz jest krótszy bądź równy od pierwotnego. Gdy w while zmienię na długość "a" to wtedy (gdy a > b) to wtedy wypisuje b ale z końcówką a)...

Czy mógłby ktoś rzucić pomysłem?
Proszę o zrozumienie, jestem świadom, że to dopiero początek i każdy jakoś przez to przechodził, ja nie chce się poddać :p

2
tyameno napisał(a):

ale nie mam pojęcia jaką długość ma mój char *.
strlen()

Zresztą nie wiem czy byłoby to dozwolone.
Dlaczego miałoby nie być?

  1. Zarezerwować dla b tyle miejsca co max(strlen(a), strlen(b)) + 1. Jeśli b już wskazuje na odpowiednio dużą tablicę to przejść do następnego kroku.
  2. Wyzerować wszystkie komórki.
  3. Skopiować z a literki.
4

Skoro uczysz się c++, to ucz siè c++, a nie haksiorskich sposobów pt. "Jak sprawić, by mój pull request został odrzucony''

W c++ sygląda to tak:

string a = "cos", b = "nic a nic";
swap(a, b); //gotowe

Taka rada od serca: skup się na rozwiązywaniu realnych problemów, bo inaczej przebimbasz 2 lata na poznanie języka bez projektu w kieszeni.

0

Dziękuję za odpowiedzi. Chciałbym jednak spróbować metodą podaną przez @twonek choć jestem świadom, że Twoja @spartanPAGE również jest odpowiednia.

Stworzyłem więc dynamiczną tablicę "b" ze wspomnianym wyżej rozmiarem, następnie wyzerowałem ją i spróbowałem uzupełnić tą samą pętlą while co wyżej. Niestety wyrzucało mi błąd o przedefiniowaniu dlatego też zostawiłem:

b = new char[dlugosc];
b[dlugosc] = { 0 };

Spróbowałem więc dodawać, normalnie petlą przechodzę po wyrazie który ma zostać "włożony" na miejsce drugiego i kolejno każdy indeks uzupełniam tj. b[i] = a[i]. Niestety funkcja nie zwraca zamienionego słowa. Do pętli wrzuciłem cout który wyświetla po kolei litery które powinny zostać zapisane w tablicy b. Czyżbym źle ją zerował? Dlaczego więc program nie wyrzuca żadnego błędu odnośnie uzupełnienia w pętli while, które zupełnie nie działa i nie podmienia żadnej litery?

0

Jak już zależy Ci na "pętlowym wykonaniu", to możesz zrobić to np tak

#include <iostream>

using namespace std;

const char *napis="TYTUL KSIAZKI";	//napis do skopiowania
main(){
char *tab = new char[20];		//ewentualnie zamiast 20 strlen(napis)+1
for(int i=0;tab[i]=napis[i];i++);	//przypisywanie czyli napis->tab 
					//oraz sprawdzenie w petli czy tab != '\0'
cout << tab;				//wypisz to co skopiowalismy
delete[] tab;				//usun tablice
}
 

W ostaniej iteracji wykonanej przez petle kopiowany jest znak '\0', a dopiero potem sprawdzany warunek. Czyli wszystko gra.

Tak jak wyżej: może powinieneś się zainteresować, prostrzymi i pewniejszymi sposobami?

Ale tak w sumie, każdy z nas kiedyś to przerabiał ... .

0
void swap(char **s1, char **s2){
  char *tmp = *s1;
  *s1 = *s2;
  *s2 = tmp;
}
1

chciałbym aby również dało się skorzystać ze stałych czyli w argumentach od razu pisać (b, "terazBedzieTo")

Ten argument, który ma być stałą, przekaż jako const char*

0

Dziękuję każdemu kto tutaj się udzielił za pomoc. Początki bywają trudne, mam nadzieję że będzie teraz coraz łatwiej!

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