Łańcuchy znaków MATERIAŁY POMOCNICZE NR 7 DO PRACOWNII Z PRZEMIOTU INFORMATYKA 1 Łańcuch znaków (napis, stała napiswa) jest t ciąg złŝny z zera lub większej liczby znaków zawartych między znakami cudzysłwu, np. napis - znaki cudzysłwu nie są częścią napisu, słuŝą jedynie d kreślenia jeg granic, W rzeczywistści łańcuch znaków jest tablicą, której elementami są pjedyncze znaki (tablica elementów typu char). Ostatnim elementem tablicy jest znak kdzie 0 (stała liczbwa 0 lub stała znakwa \0 ), znaczający kniec napisu. Większść funkcji standardwych języka C ddaje autmatycznie na kńcu ten znak. "Pies" P i e s \0 Rzmiar fizycznej pamięci przeznacznej na napis musi być jeden większy niŝ liczba znaków zawartych między znakami cudzysłwu. Deklaracja zmiennej mgącej przechwywać napis jest pdbna d deklaracji zwykłej tablicy: typ zmienna[rzmiar]; char txt[20]; - deklaracja tablicy, w której mŝna przechwywać napisy max. długści d 19 znaków. Inicjalizacja łańcucha znaków Deklarując łańcuch znaków mŝemy nadać mu wartść pczątkwą, np. char txt[10] = Pies ; P i e s \0 \0 \0 \0 \0 \0 pzstałym elementm tablicy przypisywana jest wartść zer T sam mŝna uzyskać pdając pjedyncze litery umieszczne w apstrfach, np. char txt[10] = P, i, e, s Deklarując napis mŝna nie kreślać jeg długści, kmpilatr przydzieli wtedy autmatycznie dpwiedni rzmiar pamięci (uwzględniając statni znak \0 ), np. char *txt = T jest napis ; lub char txt[] = T jest napis ; W pwyŝszy spsób mŝna nadawać wartść łańcuchwi znaków tylk przy jeg deklaracji. Błędnym zatem jest pniŝszy zapis: char txt[10]; txt = Pies ; - taki zapis jest niepprawny. Infrmatyka 1 - Pracwnia Strna 1 z 9 2009 Jarsław Frenc Prawidłwy zapis wymaga wykrzystania funkcji strcpy() z pliku nagłówkweg string.h: char txt[10]; strcpy(txt, Pies ); Stała znakwa Stała znakwa jest t liczba całkwita. Taką stałą twrzy jeden znak ujęty w apstrfy, np. x. Wartścią stałej znakwej jest wartść kdu ASCII, np. kd ASCII znak kd ASCII znak kd ASCII znak 48 0 65 A 97 a 49 1 66 B 98 b 50 2 67 C 99 c.................. 57 9 90 Z 122 z Pewne znaki niegraficzne mgą być reprezentwane w stałych znakwych przez sekwencje specjalne, które wyglądają jak dwa znaki, ale reprezentują tylk jeden znak: \n nwy wiersz \\ \ (ang. backslash) \t tabulatr pzimy \ apstrf \v tabulatr pinwy \ cudzysłów \a alarm \? znak zapytania Zapis A znacza jeden znak, natmiast zapis A - dwa znaki, gdyŝ jest t napis kńczący się znakiem \0. Funkcje d wprwadzanie i wyprwadzanie znaków printf() scanf() gets() Nagłówek: int printf(cnst char *frmat,...); d wyświetlenia łańcucha znaków uŝywamy: %s, zaś pjedynczeg znaku - %c, Nagłówek: int scanf(cnst char *frmat,...); d wczytania łańcucha znaków uŝywamy: %s, zaś pjedynczeg znaku - %c, Nagłówek: char *gets(char *s); gets wprwadza wiersz (ciąg znaków zakńczny \n ) ze strumienia stdin (klawiatura) i umieszcza w bszarze pamięci wskazywanym przez s zastępując \n znakiem \0, zwraca wskaźnik na pczątek wypełnianeg bszaru, np, char bufr[80]; gets(bufr); Infrmatyka 1 - Pracwnia Strna 2 z 9 2009 Jarsław Frenc
puts() Nagłówek: int puts(cnst char *s); puts wypisuje na stdut (ekran) zawartść łańcucha znakweg (ciąg znaków zakńczny znakiem \0 ) zastępując znak \0 znakiem \n, char bufr[80] = t jest tekst ; puts(bufr); Funkcje z pliku nagłówkweg string.h strlen() Nagłówek: size_t strlen(cnst char *s); zwraca długść łańcucha znaków, nie bierze pd uwagę znaku \0, strcpy() Nagłówek: char *strcpy(char *s1, cnst char *s2); kpiuje łańcuch s2 d łańcucha s1, strcat() Nagłówek: char *strcat(char *s1, cnst char *s2); dłącza d łańcucha s1 łańcuch s2, strchr() Nagłówek: char *strchr(cnst char *s, int c); przeszukuje łańcuch s w celu znalezienia pierwszeg wystąpienia znaku c, zwraca wskaźnik d znalezineg znaku lub NULL, jeśli znak nie zstał znaleziny, strcmp() Nagłówek: int strcmp(cnst char *s1, cnst char *s2); prównuje łańcuchy s1 i s2 z rzróŝnianiem wielkści liter, zwraca 0 gdy s1=s2, wartść mniejszą d zera, gdy s1<s2 i wartść większą d zera, gdy s1>s2, strcmpi() Nagłówek: int strcmpi(cnst char *s1, cnst char *s2); strlwr() strrev() działa jak strcmp, ale bez rzróŝniania wielkści liter, Nagłówek: char *strlwr(char *s); zamienia w łańcuchu s duŝe litery na małe, Nagłówek: char *strrev(char *s); dwraca klejnść znaków w łańcuchu s, strset() Nagłówek: char *strset(char *s, int c); wypełnia łańcuch s znakiem c, strstr() strupr() Nagłówek: char *strstr(cnst char *s1, cnst char *s2); przeszukuje łańcuch s1 w celu dnalezienia pdłańcucha s2 zwracając wskazanie d elementu łańcucha s1, d któreg zaczynają się znaki takie same jak w łańcuchu s2, lub NULL, gdy s2 nie występuje w s1, Nagłówek: char *strupr(char *s); zamienia w łańcuchu s litery małe na duŝe, Przykład nr 7.1 Przykładwe peracje na łańcuchu znaków. #include <stdi.h> #include <string.h> #include <cni.h> int main() char napis1[] = "tekst w bufrze"; char napis2[20]; int dlugsc; } printf("napis1: %s \n",napis1); dlugsc = strlen(napis1); printf("liczba znakw w napis1: %d \n",dlugsc); strupr(napis1); printf("napis1 (duze litery): %s \n",napis1); strlwr(napis1); printf("napis1 (male litery): %s \n",napis1); strcpy(napis2,napis1); printf("napis2: %s \n",napis2); strrev(napis2); printf("napis2 (dwrcny): %s \n",napis2); getch(); return 0; W wyniku uruchmienia pwyŝszeg prgramu na ekranie pjawi się: napis1: tekst w bufrze liczba znakw w napis1: 15 napis1 (duze litery): TEKST W BUFORZE napis1 (male litery): tekst w bufrze napis2: tekst w bufrze napis2 (dwrcny): ezrfub w tsket Infrmatyka 1 - Pracwnia Strna 3 z 9 2009 Jarsław Frenc Infrmatyka 1 - Pracwnia Strna 4 z 9 2009 Jarsław Frenc
Struktury Struktura jest zestawem elementów róŝnych typów, zgrupwanych pd jedną nazwą. Struktury słuŝą zatem d reprezentacji złŝnych biektów róŝnych danych. Ogólna pstać deklaracji struktury jest następująca: struct nazwa pis_pla_1; pis_pla_2;... pis pla_n; Deklaracja struktury rzpczyna się d słwa kluczweg struct, p którym mŝe występwać pcjnalna nazwa struktury (etykieta struktury). Pmiędzy nawiasami klamrwymi umieszczne są pla struktury (kmpnenty struktury, składwe struktury), mające taką samą pstać jak deklaracje zmiennych w prgramie. W deklaracji struktury muszą występwać wszystkie nawiasy klamrwe i średniki. PniŜej przedstawine są przykłady deklaracji struktur. struct punkt int x; int y; struct sba char nazwisk[20]; int wzrst, waga; struct int a, b, c; flat d, e; Pla jedneg typu mŝna łączyć przecinkami. Nazwy pól struktury mgą być takie same jak nazwy innych zmiennych w prgramie, a nawet takie same jak nazwa struktury. Deklarując strukturę wprwadzamy nwy typ danych (np. struct punkt), którym mŝna psługiwać się tak sam jak kaŝdym innym typem standardwym. P klamrze kńczącej listę pól struktury mŝe występwać lista zmiennych, np. struct sba char nazwisk[20]; } Kwalski, Nwak; - Kwalski i Nwak są zmiennymi typu struct sba. W przypadku deklaracji, p której nie występuje lista zmiennych, nie następuje przydział pamięci. Jeśli pdana zstała nazwa struktury, t zmienne mŝna zadeklarwać później, np. struct sba char nazwisk[20]; struct sba Kwalski, Nwak; Odwłania d pól struktury Dstęp d pól struktury mŝliwy jest dzięki knstrukcji typu: nazwa_struktury.nazwa_pla W pniŝszym przykładzie zapisujemy wartść 25 d pla wiek zmiennej strukturalnej Kwalski Kwalski.wiek = 25; nazwa pla krpka nazwa zmiennej typu strukturalneg Operatr krpki nazywany jest peratrem bezpśrednieg wybru pla. W przypadku, gdy zmienna strukturalna jest wskaźnikiem, t d dwłania d pla struktury uŝywamy peratra pśrednieg wybru pla (->), np. struct sba Nwak, *Nwak1; Nwak1 = &Nwak Nwak1 -> wiek = 25; lub (*Nwak1).wiek = 25; W statnim zapisie nawiasy są knieczne, gdyŝ peratr. ma wyŝszy prirytet niŝ peratr *. Przykład nr 7.2 Przykładwe peracje na strukturach. #include <stdi.h> #include <cni.h> struct sba char nazwisk[20]; int main() struct sba Nwak; Infrmatyka 1 - Pracwnia Strna 5 z 9 2009 Jarsław Frenc Infrmatyka 1 - Pracwnia Strna 6 z 9 2009 Jarsław Frenc
printf("imie: "); scanf("%s",nwak.imie); printf("nazwisk: "); scanf("%s",nwak.nazwisk); printf("wiek: "); scanf("%d",&nwak.wiek); printf("%s %s, wiek: %d\n",nwak.imie,nwak.nazwisk,nwak.wiek); typedef struct sba* ptrsba; nwa nazwa typu, stara nazwa typu, słw kluczwe typedef. } getch(); return 0; Inicjalizacja zmiennej strukturalnej W deklaracjach pól struktury nie mgą występwać inicjalizacje. MŜna natmiast inicjalizwać zmienne strukturalne, np. struct sba Nwak = Jan, Nwak,25 Brakujące pla w inicjalizacji zstaną zastąpine zerami. KaŜda wartść pczątkwa musi być wyraŝeniem stałym (nie mŝe być zmienną). Zmienne strukturalne teg sameg typu mŝna sbie przypisywać, ale nie mŝna ich prównywać ze sbą. struct sba Nwak = Jan, Nwak,40 struct sba Nwak1; Nwak1 = Nwak; Plami struktury mgą być inne struktury, mŝna definiwać tablice struktur, np. struct data int dzien, miesiac, rk; struct sba char nazwisk[20]; struct data ur; struct sba Nwak, RdzinaKwalskich[5]; Nwak.ur.rk = 1980; RdzinaKwalskich[1].ur.rk = 1965; Pla bitwe Pla bitwe umŝliwiają przechwywanie małych wartści zajmujących pjedyncze bity bez zbędnych strat pamięci. Pla bitwe deklaruje się wewnątrz struktur w następujący spsób: typ id_pla : wielkść_pla bszar zajmwany przez ple, w bitach, pcjnalny identyfikatr (nazwa) pla, typ, mŝe t być: int, unsigned int, signed int. Pla zajmują tyle bitów, ile pdan jak wielkść_pla. Wartści zapisane w plach traktwane są jak liczby całkwite. Zakres wartści pól wynika z wielkści_pla. Dstęp d pól bitwych dbywa się na takiej samej zasadzie jak d nrmalnych pól struktury, np. struct bits unsigned int a : 4; unsigned int b : 2; unsigned int : 2; unsigned int c : 6; } x; x.a = 5; x.b = 3; x.b = 4; Unie - zapis niepprawny, gdyŝ ple b zajmuje 2 bajty, a d zapisania liczby 4 ptrzebne są trzy bity (4 10 = 100 2 ). Unia jest specjalnym rdzajem struktury, w której aktywne jest tylk jedn ple. Unię deklaruje się w pdbny spsób jak strukturę: Deklaracje typedef Deklaracja typdef słuŝy d twrzenia nwych nazw typów danych, np. typedef int integer; integer x, y, *ptr; - twrzy dla typu int synnim integer, którym mŝna psługiwać się dkładnie tak sam jak typem int. unin nazwa char c; int i; duble f; } x; x.c x.i x.d Infrmatyka 1 - Pracwnia Strna 7 z 9 2009 Jarsław Frenc Infrmatyka 1 - Pracwnia Strna 8 z 9 2009 Jarsław Frenc
Zmienna x z pwyŝszeg przykładu mŝe zawierać wartść typu char lub wartść typu int lub wartść typu duble, ale tylk jedną z nich w danym mmencie. Rzmiar unii wyznaczany jest przez rzmiar największeg jej pla. Dstęp d pól unii jest taki sam jak d pól struktury, np. x.c = a ; x.d = 12.15; Unię mŝna zainicjwać jedynie wartścią typie jej pierwszej składwej. Infrmatyka 1 - Pracwnia Strna 9 z 9 2009 Jarsław Frenc