Przed omówieniem podpunktu warto przypomnieć sobie, że napis to lista liczb, które na końcu ma znak specjalny \0. Przyjrzyjmy się argumentom funkcji. Otrzymujemy napis s i znak c. Mamy zwrócić nowy dynamicznie alokowany napis. Czyli nie wolno nam modyfikować napisu wejściowego pod żadnym pozorem. Przed przejściem dalej ustalmy nagłówek funkcji:
(2.) Przyjmijmy, że znak c występuje na pozycji 0. Przechowajmy to w zmiennej pozycja. (3.) Następnie sprawdźmy znak po znaku napisu. (4.) Jeśli natrafimy na sprawdzanej pozycji znak c to (5.) zapisujemy w zmiennej pozycja nową pozycje. Na koniec każdej iteracji (6.) należy zwiększyć indeks aktualnie sprawdzanego znaku. (3.) Kiedy natrafimy na znak końca linii to przechodzimy dalej.
W tym momencie zmienna pozycja + 1 przechowuje długość napisu, który mamy przepisać. Warto zastanowić się nad przypadkiem kiedy znaku nie znajdziemy w napisie. Wtedy pozycja będzie równa 0.
Kolejna część rozwiązania polega na (8.) deklaracji nowej listy i (9. - 10.) przepisanie części napisu. Warto pamiętać, że długość tekstu do przepisania wynosi pozycja + 1, ponieważ (11.) ostatni znak musi być znakiem \0. Na koniec należy (12.) zwrócić nowy napis.
Do przetestowania funkcji podziel() można wpisać następujący kod:
Oczywiście wynikiem działania funkcji powinno być 0121.
Odwólując się do wskazówki w zadaniu wykorzystamy funkcje strcmp(), która porównuje dwa napisy. Zgodnie z jej deklaracją
podajemy jej dwa napisy, które mamy zagwarantowane, że nie zostaną zmienione. Funkcje znajdziemy w bibliotece string.h. Funkcja zwraca liczbę mniejszą od zera, gdy napis1 < napis2, 0 gdy napis1 jest taki sam jak napis2 oraz liczbę większą od zera gdy napis1 > napis2.
Pisanie kodu najlepiej rozpocząć od napisania nagłówka. Funkcja ma na podstawie podanej listy napisów i jej rozmiaru zwrócić wartość logiczną:
Kontynuując analizę zadania wiemy, że wyrazy są posortowane niemalejąco względem porządku leksykograficznego. Najważniejszą informacją z tego jest, że dwa takie same wyrazy mogą wystąpić tylko obok siebie. Żeby sprawdzić czy t napisów jest unikalnych wykonamy tylko t-1 porównań. Zadanie to realizuje poniższy kod:
Do przetestowania funkcji podziel() można wpisać następujący kod:
Testy podane do każdego wcześniejszego podpunktu wystarczy wpisać do funkcji main().