Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
1
Řetězce (1) Řetězec (string) je posloupnost znaků (hod-not typu char)
Může obsahovat: mezery znaky národních abeced řídící posloupnosti (uvozené znakem \) V jazyce C se řetězce uzavírají do uvozovek Jazyk C nemá žádný speciální datový typ pro přímé uložení řetězce 21/08/2019
2
Řetězce (2) Pro práci s řetězci se používá jednorozměr-né pole, jehož prvky jsou hodnoty typu char Každý řetězec je ukončen tzv. nulovým zna-kem – znak ’\0’(null-terminated string) Z toho vyplývá: podle nulového znaku je možné rozpoznat dél-ku celého řetězce může mít „libovolnou“ délku – omezenou veli-kostí paměti 21/08/2019
3
Řetězce (3) informace uložené za znakem ’\0’ jsou při standardním zpracování řetězců nedostupné (práce s řetězcem končí standardně dosažením prvního znaku ’\0’) pole určené pro uložení řetězce musí být o je-den byte delší (byte pro znak ’\0’) než je po-čet znaků v řetězci Poznámka: řetězcový literál (řetězcová konstanta) je zna-kem ’\0’ ukončen automaticky překladačem 21/08/2019
4
Řetězce (4) Definice pole pro uložení řetězce (tzv. statický řetězec): char idPole[pocetZnaku]; definuje pole idPole: mající pocetZnaku prvků do něhož je možné uložit řetězec o maximální délce pocetZnaku–1 Příklad: char str[10]; definuje pole str, které může sloužit pro uložení řetězce, jenž obsahuje maximálně devět znaků 21/08/2019
5
Řetězce (5) Definice pole pro řetězec může být spojena i s jeho inicializací, např.: char str1[10] = ”Jazyk C”; definuje pole str1 s 10 prvky typu char, v němž je uložený řetězec ”Jazyk C” [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] str1: ’J’ ’a’ ’z’ ’y’ ’k’ ’ ’ ’C’ ’\0’ ? ? Je-li v době definice pole pro řetězec prove-dena i inicializace, pak je možné vynechat pocetZnaku 21/08/2019
6
Řetězce (6) Příklad: char str2[] = ”Program”; definuje pole str2 s osmi prvky typu char obsahující řetězec ”Program” [0] [1] [2] [3] [4] [5] [6] [7] str2: ’P’ ’r’ ’o’ ’g’ ’r’ ’a’ ’m’ ’\0’ K jednotlivým znakům řetězce je možné přistupovat pomocí indexu: např. str2[3] zpřístupní znak ’g’ 21/08/2019
7
Řetězce (7) S řetězci lze pracovat i pomocí ukazatelů
Zápis: char *str3; definuje proměnnou str3 (tzv. dynamický řetězec), která bude ukazovat na hodnotu ty-pu char Pozor: definicí ukazatele nedojde k alokování paměťo-vého místa, do něhož bude řetězec uložen paměťové místo pro řetězec musí být následně dynamicky (v době běhu programu) alokováno pomocí funkce malloc 21/08/2019
8
Řetězce (8) Funkce malloc: deklarována v: stdlib.h
prototyp: void *malloc(size_t size); funkce: alokuje v paměti místo o velikosti size bytů vrácená hodnota: ukazatel na začátek alokovaného paměťového místa v případě, že paměťové místo nelze alokovat, pak funkce malloc vrací hodnotu NULL size_t označuje celočíselný typ bez znaménka 21/08/2019
9
Řetězce (9) Alokovaná paměť by měla být (v okamžiku, kdy již není zapotřebí) uvolněna Funkce free: deklarována v: stdlib.h prototyp: void free(void *ptr); funkce: uvolňuje (dealokuje) dříve přidělenou oblast paměti, na kterou ukazuje ukazatel ptr vrácená hodnota: funkce free nevrací žádnou hodnotu 21/08/2019
10
Řetězce (10) Ukazatel na typ char, může být také při své definici inicializován adresou řetězcové konstanty: char *str4 = ”Retezec”; Překladač automaticky vyhradí (alokuje) pro řetězcovou konstantu místo v paměti a ukon-čí ji znakem ’\0’ Řetězce je možné zobrazovat pomocí: funkce puts 21/08/2019
11
Řetězce (11) funkce printf: jako specifikátor se používá s (formátovací značka %s) Hodnoty řetězců lze načítat ze standardního vstupu pomocí funkce scanf: používá se operace s (konverzní specifikace %s) čtení probíhá tak, že se přeskočí všechny prázd-né znaky (např. mezery, tabulátory) a načte se zadaný řetězec načítání je ukončeno prvním znakem mezera, tabulátor nebo nový řádek 21/08/2019
12
Řetězce (12) není možné načíst řetězec obsahující mezeru ne-bo tabulátor vzniká riziko, že zadaný řetězec bude větší (del-ší) než je paměťové místo, které pro něj bylo vy-hrazeno: načítání bývá vhodné omezit pomocí části šířka uve-dené v konverzní specifikaci např.: char retezec[10]; scanf(”%9s”,retezec); načte maximálně 9 znaků a zajistí tak, že při zadání delšího řetězce nedojde k přepisování nepřidělené paměti 21/08/2019
13
Řetězce (13) vzhledem k tomu, že proměnná typu řetězec sa-ma o sobě obsahuje adresu, tak se při načítání pomocí funkce scanf před ní nezapisuje refe-renční operátor & Poznámka: řetězci, který je definován jako pole nelze přiřa-dit konstantu, tj. např. zápis: char str[10]; str = ”učebnice”; je chybný Při práci s řetězci lze také využívat následu-jící standardní knihovní funkce: 21/08/2019
14
Řetězce (14) Funkce gets: deklarována v: stdio.h
prototyp: char *gets(char *str); funkce: načítá znaky ze standardního vstupu do řetězce str načítání je ukončeno znakem nový řádek lze načíst řetězec obsahující mezeru nebo tabulátor načtený řetězec je automaticky ukončen znakem ’\0’ vrácená hodnota: jestliže při načítání nedojde k chybě, pak vrací hodnotu parametru str v případě chyby vrací hodnotu NULL 21/08/2019
15
Řetězce (15) Funkce fgets: poznámka: deklarována v: stdio.h
použití funkce gets může být nebezpečné, protože délka načtených dat může být větší než velikost paměti vyhrazené pro uložení řetězce doporučuje se raději používat funkci fgets, která do-voluje načítání omezit na specifikovaný počet znaků Funkce fgets: deklarována v: stdio.h prototyp: char *fgets(char *str, int n, FILE *stream); 21/08/2019
16
Řetězce (16) funkce: vrácená hodnota:
načítá znaky ze vstupního proudu stream načítání probíhá dokud: se nedorazí na znak nového řádku se nedosáhne konce vstupního souboru nepřečte n-1 znaků, aniž by před tím byl konec souboru ne-bo znak nového řádku za přečtené znaky se přidá znak ’\0’ jestliže je čtení ukončeno znakem nového řádku, pak znak nového řádku je těsně před znakem ’\0’ vrácená hodnota: při úspěšném ukončení vrací hodnotu parametru str 21/08/2019
17
Řetězce (17) je-li dosažen konec souboru před načtením jakéhokoliv znaku, pak funkce vrací hodnotu NULL a obsah para-metru str se nezmění jestliže při čtení dojde k chybě, pak funkce fgets vrací také hodnotu NULL a obsah parametru str není definovaný poznámka: pro načítání ze standardního vstupu se jako parametr pro vstupní proud používá stdin 21/08/2019
18
Řetězce (18) Funkce strlen: deklarována v: string.h
prototyp: size_t strlen(const char *str); funkce: určuje délku řetězce, na nějž ukazuje parametr str vrácená hodnota: délka řetězce počet znaků od začátku řetězce str až ke znaku ’\0’ (znak ’\0’ se do výsledné délky už nezapočítává) 21/08/2019
19
Řetězce (19) Funkce strcpy: deklarována v: string.h
prototyp: char *strcpy(char *dest, const char *source); funkce: kopíruje obsah řetězce source do řetězce dest (včetně znaku ’\0’) původní obsah řetězce dest je přepsán vrácená hodnota: funkce vrací hodnotu dest 21/08/2019
20
Řetězce (20) Funkce strcat: deklarována v: string.h
prototyp: char *strcat(char *dest, const char *source); funkce: připojí obsah řetězce source (včetně znaku ’\0’) na konec řetězce dest znak ’\0’ u řetězce dest je přepsán prvním znakem řetězce source vrácená hodnota: funkce vrací hodnotu dest 21/08/2019
21
Řetězce (21) Funkce strcmp: deklarována v: string.h
prototyp: int strcmp(const char *str1, const char *str2); funkce: lexikograficky (ve smyslu kódu ASCII) porovnává řetězec str1 a řetězec str2 vrácená hodnota: =0 v případě, že řetězce str1 a str2 jsou shodné <0 jestliže str1 je menší než str2 >0 pokud str1 je větší než str2 21/08/2019
22
Řetězce (22) Poznámka: v hlavičkovém souboru string.h jsou dek-larovány také funkce strncpy, strncat a strncmp jedná se o funkce, které nemusí pracovat s celým řetězcem, ale pouze se zadaným počtem jeho prv-ních znaků zmíněné funkce mají navíc formální parametr, po-mocí něhož se předává maximální počet zpraco-vávaných znaků tyto funkce zpracovávají řetězec do: určené délky – je-li řetězec delší než požadovaná délka zpracování 21/08/2019
23
Řetězce (23) jejich prototypy jsou:
do ukončovacího znaku ’\0’ – je-li řetězec kratší než požadovaná délka zpracování jejich prototypy jsou: char *strncpy(char *dest, const char *source, size_t n); char *strncat(char *dest, const char *source, size_t n); int strncmp(const char *str1, const char *str2, size_t n); 21/08/2019
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.