• 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.

VPS Starter Arubacloud
0 głosów
129 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,590 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ź 383 wizyt
0 głosów
0 odpowiedzi 227 wizyt
+1 głos
0 odpowiedzi 174 wizyt

92,452 zapytań

141,262 odpowiedzi

319,080 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...