ANSI C 2

ANSI C 2



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


Wyszukiwarka

Podobne podstrony:
ANSI C 2 5 WSKAŹNIKI I TABLICE _______—— Ćwiczenie 5.16. Dodaj opcję -d (kolejność słownikowa) spr
ANSI C 1 5 WSKAŹNIKI I TABLICE------- if (left >= right) /* nic nie rób, jeśli tablica zawiera
ANSI C 4 WSKAŹNIKI I TABLICE Wskaźnik jest zmienną, która zawiera adres innej zmiennej. W języku C
ANSI C 5 5 WSKAŹNIKI I TABLICE Jeżeli wskaźnik ip wskazuje na zmienną całkowitą x, to *ip może wys
ANSI C 6 5 WSKAŹNIKI I TABLICE _ Obrazowo wygląda to tak: 5 2 WSKAŹNIKI I ARGUMENTY FUNKCJI w miej
ANSI C 7 5 WSKAŹNIKI I TABLICE Ćwiczenie 5.1. Tak jak została napisana, funkcja getint traktuje zn
ANSI C 8 5 WSKAŹNIKI I TABLICE Między nazwą tablicy a wskaźnikiem jest jednak istotna różnica, o k
ANSI C 9 5 WSKAŹNIKI I TABLICE______—-- alloc i afree jest stosem lub listą LIFO (ang. last-in, fi
ANSI C 0 5 WSKAŹNIKI I TABLICE o specjalną wartość wskaźnikową. Stała NULL jest zdefiniowana w
ANSI C 1 5 WSKAŹNIKI I TABLICE Stałe napisowe chyba najczęściej występują jako argumenty funkcji,
ANSI C 3 5 WSKAŹNIKI I TABLICE możliwości są zawarte w funkcjach: getline (rozdz. 1 i 4), atoi, it
ANSI C 4 5 WSKAŹNIKI I TABLICE #define MAXLEN 1000 /* maks. długość wiersza wejściowego */ int get
ANSI C 5 5 WSKAŹNIKI I TABLICE /* swap: zamień miejscami v[i] i v[j] */ void swap(char *v[], int i
ANSI C 6 5 WSKAŹNIKI I TABLICE_______—- Oprócz tej różnicy w zapisie tablicę dwuwymiarową traktuj
ANSI C 7 5 WSKAŹNIKI I TABLICE oba zapisy a[3][4] i b[31[4] są poprawnymi odwołaniami do pojedyncz
ANSI C 8 5 WSKAŹNIKI I TABLICE ____________— for (i = 1; i < argc; i-H-) printf(,,%s%s”, argv[i
ANSI C 9 5 WSKAŹNIK! I TABLICE ________— A oto program: #include <stdio.h> #include
ANSI C 0 5 WSKAŹNIKI I TABLICE -------- ten program tak, aby najlepiej wykorzystywał dostępną mu p
ANSI C 3 5 WSKAŹNIKI I TABLICE__-— --- konstrukcja *pfa[] zostanie rozpoznana jako deklarator, a z

więcej podobnych podstron