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!