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

Object Storage Arubacloud
0 głosów
133 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ź 403 wizyt
0 głosów
0 odpowiedzi 247 wizyt
+1 głos
0 odpowiedzi 183 wizyt

92,581 zapytań

141,433 odpowiedzi

319,666 komentarzy

61,966 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...