Knihovna string.h
V předchozím výkladu syntaxe jazyka C jsem využíval některých standardních knihoven a jejich funkcí, například printf() a scanf(). Další funkce, se kterými jste se seznámili, byli například funkce rand() a srand(), nebo třeba funkce atoi(). Mimoto jsme se setkali i s funkcemi nestandardními, implementačně závislými (delay() a usleep()).
V této a dalších kapitolách se budu věnovat nejpoužívanějším standardním funkcím ze standardních knihoven. Nebudu vypisovat všechny funkce (a ani všechny knihovny). Jejich popis, a mnohde i příklady použití, najdete v dokumentaci k překladači, nebo v manuálových stránkách (na Linuxu).
Začnu něčím jednodušším, a to funkcemi pracujícími s řetězci. Tyto funkce jsou definovány v knihovně <string.h>. Jen připomínám, že řetězce jsou datové pole obsahující znaky, které jsou zakončeny zarážkou '\0' (nulový bajt).
Výčet funkcí
Vzhledem ke zjednodušení popisu se nebudu vyjadřovat exaktně a
například místo „řetězec, na který ukazuje ptr“ budu psát
„řetězec ptr“. Doufám, že tím nezpůsobím příliš zmatků :-).
A ještě připomínám, že typ size_t
je ekvivalent typu
unsigned int
, který by měl být dostatečně velký na to,
aby byl schopný adresovat celou délku i toho největšího pole.
Pokud (standardní) funkce někam kopírují data, většinou nekontrolují, zda na to mají dostatek místa. To musíte zajistit vy, jako programátoři. Jinak se může snadno stát, že program skončí kvůli „neoprávněnému přístupu do paměti“.
- Funkce připojí řetězec src k řetězci dest (na jeho konec). Funkce vrací ukazatel na řetězec dest.
- Jako funkce strcat, ale přidá jen n znaků z src. Tato funkce je bezpečnější z hlediska možného "přetečení" (pokus zapisovat více dat, než jakou má velikost dest). Měli byste spíše používat tuto verzi.
- Porovnává řetězce s1 a s2. Pokud je s1 < s2 pak vrací hodnotu menší než 0, pokud jsou si rovny, pak vrací 0, pokud je s1 > s2 pak vrací hodnotu větší jak 0.
- Jako strcmp(), porovnává však jenom n znaků.
- Zkopíruje řetězec src do řetězce dest. Vrací ukazatel na dest.
- Jako strcpy(), ale zkopíruje maximálně n znaků. (Je-li jich právně n, nepřidá zarážku).
- Vrací délku řetězce s.
- Vrací ukazatel na první pozici, kde se vyskytuje znak c, nebo NULL v případě, že jej nenajde. (Nenechte se zmást, že znak c je typu int a ne char, má to tak být).
- To samé jako
strchr()
, ale hledá první výskyt zprava. - Vrací ukazatel na první výskyt řetězce needle v řetězci haystack. Pokud jej nenajde, vrací NULL.
- Vrací počet počátečních znaků, ve kterých řetězec s obsahuje znaky z řetězce accept (v libovolném pořadí).
- Vrací počet znaků, ve kterých řetězec s neobsahuje žádný znak z řetězce reject.
Příklad použití funkcí
Nemusím snad říkat, že je třeba v programu deklarovat knihovnu <string.h>, pokud chcete používat funkce z této knihovny.
V příkladu si všimněte především použití funkce
strncpy()
. Díky zjištění délky prvního
řetězce a velikosti pole1 jsem mohl zajistit,
aby se z pole2 nezkopírovalo více znaků,
než kolik se jich do pole1 vejde.
- /*------------------------------------------------*/
- /* c19/retezce.c */
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <string.h>
- {
- int x;
- }
- /*------------------------------------------------*/
Makro _CRT_SECURE_NO_WARNINGS
je tu kvůli funkci scanf()
,
viz scanf().
Možný výstup z programu:
Zadejte jeden znak a stisknete ENTER: y Zadejte prvni retezec: DlouhyRetezec Zadejte druhy retezec: Dlouze pole1 < pole2 Prvnich 5 znaku se neshoduje Prvnich 4 znaku pole1 je v pole2 pole1 od znaku y: yRetezec Delka prvniho retezce: 13 Spojeni: DlouhyRetezecDlouze
Platí, že pole1 < pole2
, protože h < z.