5 WSKAŹNIKI I TABLICE _______^
operator przyrostkowy ++ nie zmieni t, dopóki nie zostanie pobrany wskazywany znak. Na tej samej zasadzie znak jest wstawiany w miejsce wskazywane przez s przed zwiększeniem wskaźnika s. Ten sam znak jest także wartością porównywaną ze zna. kiem ’\0’ przy sterowaniu pętlą. Miłym zakończeniem całej operacji jest to, że znak; tekstu z t przepisano do s wraz z kończącym znakiem ’\0\
Przed ostatecznym skróceniem funkcji zauważ, że porównanie ze znakiem ’\0’ jest zbyteczne, ponieważ pytanie dla warunku pętli zawsze po prostu brzmi: czy wartością wyrażenia jest zero? Funkcję strcpy można zatem napisać w ten sposób:
/* strcpy: skopiuj t do s; wersja wskaźnikowa 3 */ void strcpy(char *s, char *t)
while (*s++ = *t++)
9
Na pierwszy rzut oka może to wyglądać tajemniczo, wygoda w zapisie jest jednak ogromna. Takie skróty warto opanować choćby tylko dlatego, że często możesz je spotkać w programach w C.
Funkcja strcpy z biblioteki standardowej (<string.h>) zwraca wynikowy tekst jako swoją wartość funkcyjną.
Drugą funkcją, którą chcemy tu omówić, jest strcmp(s,t). Funkcja ta porównuje dwa teksty zawarte w s oraz t i zwraca odpowiednio wartość ujemną, równą zero lub dodatnią w zależności od tego, czy tekst w s jest leksykograficznie mniejszy, równy lub większy niż tekst w t. Zwracaną wartość otrzymuje się odejmując od siebie znaki na pierwszej pozycji, na której teksty się różnią.
/* strcmp: zwróć: <0 jeśli s < t, 0 jeśli s == t, >0 jeśli s > t */ int strcmp(char *s, char *t)
int i;
for (i = 0; s[i] ==t[i]; i++) if (s[ij == *\0’) return 0; return s[ij - t[ij;
5.5 WSKAŹNIKI ZNAKOWE I FUNKCJE _______
powered by
Mi si ol
A oto wskaźnikowa wersja funkcji strcmp:
/* strcmp: zwróć: <0 jeśli s < t, 0 jeśli s == t, >0 jeśli s > t */ int strcmp(char *s, char *t)
for (; *s == *t; s++, t++) if (*s == ’\0’) return 0; return *s - *t;
Ponieważ ++ i -7 są operatorami zarówno przedrostkowymi, jak i przyrostkowymi, mogą wystąpić (choć rzadziej) również inne kombinacje operatorów *, ++ i —. Na przykład
*—P
zmniejsza p przed pobraniem znaku wskazywanego przez p. W rzeczywistości parę wyrażeń:
*p++ = val; /* wstaw val na szczyt stosu */
val = *—p; /* zdejmij wartość ze szczytu stosu do val */
można nazwać standardowymi idiomami języka C służącymi do obsługi stosu; patrz omówienie w p. 4.3.
Nagłówek <string.h> zawiera deklaracje omówionych tu funkcji oraz duży wybór innych funkcji manipulujących tekstami, pochodzących z biblioteki standardowej.
Ćwiczenie 5.3. Napisz wskaźnikową wersję funkcji strcat opisanej w rozdz. 2: funkcja strcat(s,t) dopisuje tekst z t na koniec tekstu w s.
Ćwiczenie 5.4. Napisz funkcję strend(s,t), która zwraca 1, jeśli tekst z t występuje na końcu tekstu w s; w przeciwnym przypadku zwraca zero.
Ćwiczenie 5.5. Napisz własne wersje funkcji bibliotecznych strncpy, strncat oraz strncmp, które obsługują co najwyżej n początkowych znaków swoich argumentów. Dla przykładu, funkcja strncpy(s,t,n) kopiuje co najwyżej n znaków tekstu z t do s. Pełne opisy tych funkcji znajdziesz w dodatku B.
Ćwiczenie 5.6. Napisz na nowo odpowiednie programy i ćwiczenia z poprzednich rozdziałów, stosując w nich wskaźniki zamiast indeksowania tablic. Interesujące
147