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 03/01/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 03/01/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 03/01/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ů 03/01/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 03/01/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’ 03/01/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 03/01/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 03/01/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 03/01/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 03/01/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 03/01/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 03/01/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: 03/01/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 03/01/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); 03/01/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 03/01/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 03/01/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á) 03/01/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 hodnota: funkce vrací hodnotu dest 03/01/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 hodnota: funkce vrací hodnotu dest 03/01/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 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 03/01/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í 03/01/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); 03/01/2019
24
Řetězce (24) Funkce strchr: deklarována v: string.h
prototyp: char *strchr(const char *str, int c); funkce: hledá první výskyt znaku c (převedeného na typ char) v řetězci str vrácená hodnota hodnota: ukazatel na nalezený znak jestliže se znak c v řetězci str nevyskytuje, pak funkce vrací hodnotu NULL 03/01/2019
25
Řetězce (25) Funkce strrchr: deklarována v: string.h
prototyp: char *strrchr(const char *str, int c); funkce: hledá poslední výskyt znaku c (převedeného na typ char) v řetězci str vrácená hodnota hodnota: ukazatel na nalezený znak jestliže se znak c v řetězci str nevyskytuje, pak funkce vrací hodnotu NULL 03/01/2019
26
Řetězce (26) Funkce strstr: deklarována v: string.h
prototyp: char *strstr(const char *str, const char *substr); funkce: hledá první výskyt podřetězce substr v řetězci str vrácená hodnota hodnota: ukazatel na začátek prvního výskytu podřetězce substr v řetězci str jestliže se řetězec substr v řetězci str nevyskytuje, pak funkce vrací hodnotu NULL 03/01/2019
27
Řetězce (27) Funkce strtod: deklarována v: stdlib.h
prototyp: double strtod(const char *str, char **ptr); funkce: převádí počáteční část řetězce str na číselnou hodnotu typu double funkce strtod očekává, že převáděné číslo se skládá z následujících částí: případné prázdné znaky (např. mezery), které funkce strtod přeskočí případné znaménko plus nebo mínus (+ nebo –) 03/01/2019
28
Řetězce (28) vrácená hodnota hodnota: v případě úspěšného převodu:
posloupnost desítkových číslic, která může obsahovat jeden oddělovač desetinné části (typicky desetinná tečka) případná exponentová část, která se skládá z písmene e nebo E, případného znaménka a posloupnosti desítkových číslic vrácená hodnota hodnota: v případě úspěšného převodu: vrací převedenou číselnou hodnotu (typu double) jestliže parametr ptr nemá v době volaní hodnotu NULL, pak je funkcí nastaven tak, aby ukazoval na první znak v str, kte-rý bezprostředně následuje za převedenou částí řetězce v případě, kdy řetězec není možné převést (jeho začátek neodpovídá očekávanému číselnému modelu): vrací hodnotu 0 proměnná errno se nastaví na hodnotu ERANGE jestliže parametr ptr nemá hodnotu NULL, pak funkce nastaví *ptr na hodnotu str 03/01/2019
29
Řetězce (29) Funkce strtol: deklarována v: stdlib.h
prototyp: long int strtol(const char *str, char **ptr, int base); funkce: převádí počáteční část řetězce str na číselnou hodnotu typu long int funkce strtol očekává, že převáděné číslo se skládá z následujících částí: případné prázdné znaky (např. mezery), které funkce strtol přeskočí 03/01/2019
30
Řetězce (30) vrácená hodnota hodnota:
případné znaménko plus nebo mínus (+ nebo –) posloupnost číslic v číselné soustavě o základu base je-li base=0, pak se předpokládá soustava: desítková – číslo musí začínat nenulovou desítkovou číslicí osmičková – číslo musí začínat nulou šestnáctková – číslo musí začínat 0x nebo 0X má-li base hodnotu v rozmezí 2 až 36, pak: se očekává, že řetězec str obsahuje číslice dané soustavy při base=16 není nutné, aby číslo začínalo 0x nebo 0X vrácená hodnota hodnota: v případě úspěšného převodu: vrací převedenou číselnou hodnotu (typu long int) jestliže parametr ptr nemá v době volaní hodnotu NULL, pak je funkcí nastaven tak, aby ukazoval na první znak v str, kte-rý bezprostředně následuje za převedenou částí řetězce 03/01/2019
31
Řetězce (31) Funkce strtoul: deklarována v: stdlib.h
v případě, kdy řetězec není možné převést (jeho začátek neodpovídá očekávanému číselnému modelu): vrací hodnotu 0 proměnná errno se nastaví na hodnotu ERANGE jestliže parametr ptr nemá hodnotu NULL, pak funkce nastaví *ptr na hodnotu str Funkce strtoul: deklarována v: stdlib.h prototyp: unsigned long int strtoul (const char *str, char **ptr, int base); 03/01/2019
32
Řetězce (32) Funkce sprintf: funkce: deklarována v: stdio.h
pracuje podobně jako funkce strtol počáteční část řetězce specifikovaného parametrem str je převáděna na hodnotu typu unsigned long int Funkce sprintf: deklarována v: stdio.h prototyp: int sprintf(char *str, const char *format,…); pracuje podobně jako funkce printf 03/01/2019
33
Řetězce (33) pro parametr format platí stejná pravidla jako u fun-kce printf posloupnost dat specifikovaná parametrem format není vypisována na standardní výstup, ale je ukládána do řetězce str řetězec str je automaticky ukončen znakem ’\0’ je zapotřebí, aby pro řetězec str bylo vymezeno do-statečně velké paměťové místo (v opačném případě dojde k přepisování nepřidělené paměti) poznámka: funkci sprintf lze využít např. pro převod číselné hodnoty na řetězec 03/01/2019
34
Řetězce (34) Funkce sscanf: deklarována v: stdio.h
prototyp: int sscanf(char *str, const char *format,…); funkce: pracuje podobně jako funkce scanf pro parametr format platí stejná pravidla jako u fun-kce scanf znaky nejsou načítány ze standardního vstupu, ale z ře-tězce str 03/01/2019
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.