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

Jak napisać program na wskaźnikach, który będzie usuwać następujące po nim duplikaty.

0 głosów
212 wizyt
pytanie zadane 1 grudnia 2018 w C i C++ przez Curiosis Użytkownik (540 p.)
Witajcie, jestem zielony z programowania, a co dopiero jeśli chodzi o wskaźniki. Otrzymałem takie zadanie i nie wiem kompletnie jak się za nie zabrać. Jeśli ktoś mógłby pomóc byłbym bardzo wdzięczny. Jakakolwiek pomoc się przyda.

 

Zaimplementuj funkcję o nazwie 'usun' , gdzie obydwa argument 'tekst' i 'wzorzec' są łańcuchami znaków.
Zaimplementuj funkcję w taki sposób, aby z łańcucha 'tekst' usunęła pierwsze wystąpienie w nim słowa 'wzorzec'.
Np. dla dwóch łańcuchów wejściowych:
 "Ala ma kota i Ewa ma kota", "kota"
pierwszy z nich zostanie zmodyfikowany do postaci:
"Ala ma i Ewa ma kota"

 

Z góry dziękuję za pomoc

1 odpowiedź

0 głosów
odpowiedź 1 grudnia 2018 przez criss Mędrzec (172,570 p.)

Funkcja mogłaby wyglądać tak:

void usun(char tekst[], const char wzorzec[])
{
//...
}

Podczas testowania pamiętaj, że `tekst` musi być w modyfikowalnej pamięci, więc wywołanie może wyglądać tak:

char str[] = "Ala ma kota i Ewa ma kota";
// deklarując jako tablice, ciąg znaków zostanie umieszczony na stosie i będziesz mógł tą pamięc modyfikować
// gdybyś zadeklarował jako `char* str`, to ciąg znaków zostanie umieszczony w globalnej pamięci read-only (o ile kompilator w ogóle pozwoli ci na takie przypisanie)
usun(str, "kota");
// `wzorzec` może być już podany w sposób taki jak powyżej ("kota" jest typu `const char*`), bo nie będziemy modyfikować tej pamięci

Co do samej funkcji:

  • użyj funkcji strstr do znalezienia ciągu `wzorzec` w ciągu `tekst`. strstr(tekst, wzorzec) da ci adres (wskaźnik) do pierwszego wystąpienia `wzorzec` wewnątrz `tekst`. Jeśli nie rozumiesz, to zobacz co ci wyświetli printf("%s", strstr("Ala ma kota i Ewa ma kota", "kota"));
  • użyj funkcji strlen do określenia długości ciągu wzorzec
  • pamiętaj, że jeśli `wzorzec` nie znajduje sie w `tekst`, to strstr da ci NULL i nie musisz wtedy nic robić

Z powyższymi informacjami, wystarczy, że przekopiujesz ciąg znajdujący się za znalezionym wzorcem w miejsce gdzie wzorzec się zaczyna. Do przekopiowania łańcuchów znaków możesz użyć strcpy. Pseudokod:

void usun(char tekst[], const char wzorzec[])
{
   strcpy(wskaznik_do_znalezionego_wzorca, tekst + dlugosc_wzorca);
}

Jeśli nie rozumiesz jak to działa, że strlen magicznie określa długość ciągu znaków:

char str[] = "abcd"
// jest równoznaczne z:
char str[] = {'a', 'b', 'c', 'd', 0};
// zauważ 0 na końcu - to znak końca łańcucha
// zauważ, że to jest 0, a nie '0'

strlen określa ilość nie-zerowych elementów pomiędzy podanym adresem aż do natrafienia na 0. Zagadka rozwiązana!

Podobne pytania

–2 głosów
1 odpowiedź 677 wizyt
0 głosów
0 odpowiedzi 321 wizyt
+1 głos
0 odpowiedzi 287 wizyt

93,424 zapytań

142,421 odpowiedzi

322,646 komentarzy

62,785 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...