Práce s řetězci v jazyce C
Standardní knihovna jazyka C obsahuje sadu funkcí, které implementují různé operace s textovými řetězci (jak znakovými tak bajtovými), např. kopírování, zřetězení, rozklad na lexikální symboly nebo vyhledávání. Standardní knihovna pracuje s řetězci zakončenými znakem s kódem 0, kdy řetězec n znaků je reprezentován n + 1-prvkovým polem, jehož poslední prvek je znak s kódem 0 nazývaný „NUL“.
Jedinou podporou řetězců přímo v programovacím jazyce C je, že překladač převádí řetězcové literály na pole znaků zakončená znakem s kódem 0.
Definice
Řetězec v jazyce C je souvislá posloupnost kódových jednotek ukončená první nulovou kódovou jednotkou (znakem NUL).[1] To znamená, že znaky s kódem nula nemohou být obsaženy v řetězci. Délka řetězce je počet kódových jednotek před nulovou kódovou jednotkou,[1] a proto řetězec zabírá vždy o jednu kódovou jednotku více paměti, než je délka řetězce, protože je potřebné místo pro uložení koncové nuly.
Termín řetězec obecně znamená řetězec, jehož kódová jednotka má typ char
, což je na všech moderních strojích 8 bitů. C90 definuje široké řetězce[1] který používá kódovou jednotku typu wchar_t
, která má na moderních strojích velikost 16 nebo 32 bitů. Tento typ byl určen pro znaky Unicode, ale stále běžnější je používat pro Unicode kódování UTF-8.
Řetězce jsou předávány funkcím jako ukazatele na první kódovou jednotku. Kvůli tomu, že char *
a wchar_t *
jsou různé typy, funkce, které zpracovávají široké řetězce, se liší od funkcí na zpracování normálních řetězců a mají odlišná jména.
Řetězcové literály ("abc"
ve zdrojovém kódu v jazyce C) se při překladu konvertují na pole.[2] Výsledkem je pole kódových jednotek obsahující jednotlivé znaky s přidanou nulovou kódovou jednotkou na konci. Zápis L"text"
v C90 produkuje široký řetězec. Řetězcový literál může obsahovat kódovou jednotku nula (např. použitím \0
v jeho zápise), ale to způsobí ukončení řetězce v tomto místě. Zbytek literálu bude uložen do paměti (s další kódovou jednotkou nula přidanou na konec), ale není možné zjistit, že tyto kódové jednotky byly přeloženy z řetězcového literálu, proto takový zdrojový kód není řetězcový literál.[3]
Kódování znaků
Každý řetězec končí prvním výskytem nulové kódové jednotky daného typu (char
nebo wchar_t
). V důsledku toho bajtový řetězec (char*
) může obsahovat znaky různé od NUL v ASCII nebo libovolné rozšíření ASCII, ne však znaky v kódování UTF-16 (v nenulových 16bitových kódových jednotkách mohou být vyšší nebo nižší bajty nulové). Jaká kódování lze ukládat v širokých řetězcích, závisí na šířce wchar_t
. Ve většině implementací má wchar_t
alespoň 16 bitů, a proto jej lze použít pro ukládání libovolného 16bitového kódování, např. UCS-2. Pokud wchar_t
má 32 bitů, pak umožňuje ukládání textů ve 32bitovém kódování, např. UTF-32. (Norma vyžaduje „typ, který pojme libovolně široký znak“, což od přechodu z UCS-2 na UTF-16 ve Windows už není pravda. To bylo uznáno jako chyba v normě a v C++ opraveno.)[4] Verze C++11 a C11 přidaly dva typy char16_t
a char32_t
s explicitní šířkou.[5]
Kódování proměnné šířky může být použito jak pro bajtové řetězce tak pro široké řetězce. Délka řetězce a pozice v řetězci (offset) se udává v bajtech nebo wchar_t
, ne ve „znacích“, což může začínající programátory mást. Kódování UTF-8 a Shift JIS se často používají v bajtových řetězcích, zatímco UTF-16 se často používá v širokých řetězcích, když wchar_t
je 16 bitů. Zkrácení řetězce s proměnnou šířkou znaků pomocí funkcí jako je strncpy
, může na konci řetězce produkovat neplatné posloupnosti. To může být nebezpečné, pokud jsou zkrácené řetězce interpretovány kódem, který předpokládá, že vstup je platný.
Podpora Unicode literálů, např. UTF-8 char foo[512] = "φωωβαρ";
nebo wchar_t foo[512] = L"φωωβαρ";
(UTF-16 nebo UTF-32, podle definice wchar_t
) je definovaná implementací,[6] a může vyžadovat, aby zdrojový kód byl ve stejném kódování jako literály, zvláště pro typ char
, kde překladače mohou pouze kopírovat to, co je mezi uvozovkami. Některé překladače nebo editory mohou vyžadovat, aby se všechny neASCII znaky zapisovaly ve tvaru \xNN
pro každý bajt kódování UTF-8, a/nebo \uNNNN
pro každou kódovou jednotku UTF-16. Od verze C11 (a C++11) lze používat novou předponu literálu u8
, která zajistí vytvoření řetězcového literálu v kódování UTF-8, např. char foo[512] = u8"φωωβαρ";
.[7] Ve verzi C++20 a C23 byl přidán typ char8_t
určený pro ukládání UTF-8 znaků, typ znakových literálů s prefixem u8
byl změněn na char8_t
a řetězcových literálů s prefixem u8
na char8_t[]
.
Vlastnosti
Terminologie
V historické dokumentaci se při popisu řetězců v jazyce C často používal termín „znak“ místo „byte“, což vedlo k představě, že tyto funkce nefungují pro UTF-8. Ve skutečnosti jsou ve všech implementacích všechny délky definovány v bajtech, a tyto funkce pracují stejně dobře s UTF-8 jako s jednobajtovými kódy. BSD dokumentace byla opravena, aby to bylo jasné, ale dokumentace POSIXu, Linuxu a Windows na mnoha místech, kde by mělo být použito slovo „byte“ nebo „wchar_t“, stále používá „znak“.
Funkce pro zpracovávání paměťových bufferů mohou zpracovávat posloupnosti bajtů, které obsahují nulový bajt jako část dat. Jména těchto funkcí obvykle začínají mem
, zatímco jména funkcí pracujících s řetězci zakončenými nulovým znakem začínají str
.
Hlavičkové soubory
Většina funkcí pro práci s řetězci v jazyce C je deklarována v hlavičkovém souboru string.h
(v C++ cstring
), zatímco funkce pracující se širokými řetězci jsou deklarovány v hlavičkovém souboru wchar.h
(v C++ cwchar
). Tyto hlavičkové soubory také obsahují deklarace funkcí používaných pro práci s paměťovými bloky; názvy hlavičkových souborů jsou tedy poněkud zavádějící.
Funkce deklarované v string.h
jsou velmi oblíbené, protože jako část Standardní knihovny jazyka C jsou dostupné na libovolné platformě, která podporuje jazyk C. Pokud tyto funkce nejsou použity pečlivě a správně mají některé bezpečnostní problémy, např. nebezpečí přetečení bufferu, což způsobuje, že někteří programátoři dávají přednost bezpečnějším a případně méně přenositelným alternativám, z nichž některé oblíbené jsou uvedeny níže. Některé z těchto funkcí také porušují const-korektnost tím, že přijímají ukazatel na const
řetězec a vracejí nekonstatní ukazatel v řetězci. Pro opravu tohoto nedostatku byly některé z nich ve standardní knihovně C++ rozděleny do dvou přetížených funkcí.
Konstanty a typy
Jméno | Popis |
---|---|
NULL |
Makro, které se expanduje na konstantu nulového ukazatele; je to konstanta reprezentující hodnotu ukazatele, která určitě není platnou adresou objektu v paměti. |
wchar_t
|
Typ používaný pro kódové jednotky v „širokých“ řetězcích. Na Windows, jediné platformě, která široce používá wchar_t , je 16bitový,[8] což bylo dostatečné pro reprezentaci libovolného Unicode znaku (v kódování UCS-2), ale po přechodu na UTF-16 to stačí pouze pro reprezentaci kódové jednotky UTF-16, která může tvořit jen polovinu kódového bodu UTF-16. Na jiných platformách bývá wchar_t 32bitový, kam se vejdou všechny kódové body Unicode. Norma jazyka C pouze vyžaduje, aby wchar_t byl dostatečně široký pro ukládání znaků nejširší znakové sady podporované systémovými locale[9] a měl větší nebo stejnou velikost jako char .[10]
|
wint_t
|
Celočíselný typ, který může pojmout libovolnou hodnotu wchar_t , stejně jako hodnotu makra WEOF. Tento typ se při zavádění nových celočíselných typů nemění. Obvykle 32bitová hodnota se znaménkem.
|
char8_t [11]
|
Od verze C23; v <uchar.h> , typ, který je vhodný pro ukládání UTF-8 znaků.[12]
|
char16_t [13]
|
Od verze C11;[14] v <uchar.h> , typ, který může uchovávat 16 bitů i kdyby wchar_t měl jinou velikost. Pokud je hodnota makra __STDC_UTF_16__ rovna 1, typ se používá pro UTF-16 na tomto systému. To platí v C23 vždy.[15] C++ takové makro nedefinuje, ale tento typ se v tomto jazyce vždy používá pro UTF-16.[16]
|
char32_t [13]
|
Od verze C11;[17] v <uchar.h> , typ schopný uchovávat 32 bitů i kdyby wchar_t měl jinou velikost. Pokud makro __STDC_UTF_32__ je definovaný jako 1, typ se používá pro UTF-32 na tomto systém. To je vždy případ v C23.[15] C++ takové makro nedefinuje, ale tento typ se v tomto jazyce vždy používá pro UTF-32.[16]
|
mbstate_t
|
Obsahuje všechny informace o stavu konverze, které je třeba uchovat mezi dvěma zavoláními funkcí. |
Funkce
Bajt řetězec |
Široký řetězec |
Popis[pozn. 1] | |
---|---|---|---|
Řetězec manipulace |
strcpy [18]
|
wcscpy [19]
|
zkopíruje jeden řetězec do druhého |
strncpy [20]
|
wcsncpy [21]
|
zapíše přesně n bajtů, kopíruje ze zdroje nebo přidá nulové znaky | |
strcat [22]
|
wcscat [23]
|
připojí jeden řetězec k druhému | |
strncat [24]
|
wcsncat [25]
|
připojí nejvýše n bajtů z jednoho řetězce k druhému | |
strxfrm [26]
|
wcsxfrm [27]
|
transformuje řetězec podle aktuálního locale | |
Řetězec přezkoumání |
strlen [28]
|
wcslen [29]
|
vrátí délka řetězce |
strcmp [30]
|
wcscmp [31]
|
porovná dva řetězce (třícestné porovnání) | |
strncmp [32]
|
wcsncmp [33]
|
porovná určitý počet bajtů ve dvou řetězcích | |
strcoll [34]
|
wcscoll [35]
|
porovná dva řetězce podle aktuálního locale | |
strchr [36]
|
wcschr [37]
|
vyhledá první výskyt bajtu v řetězci | |
strrchr [38]
|
wcsrchr [39]
|
vyhledá poslední výskyt bajtu v řetězci | |
strspn [40]
|
wcsspn [41]
|
vrátí počet počátečních bajtů v řetězci, které jsou v druhém řetězci | |
strcspn [42]
|
wcscspn [43]
|
vrátí počet počátečních bajtů v řetězci, které nejsou v druhém řetězci | |
strpbrk [44]
|
wcspbrk [45]
|
vyhledá v řetězci první výskyt bajtu v množině | |
strstr [46]
|
wcsstr [47]
|
vyhledá první výskyt podřetězce v řetězci | |
strtok [48]
|
wcstok [49]
|
rozdělí řetězec na tokeny | |
Různé |
strerror [50]
|
— | vrátí řetězec obsahující zprávu odpovídající chybovému kódu |
Paměť manipulace |
memset [51]
|
wmemset [52]
|
vyplní buffer opakováním bajtu; od C23 bylo přidáno memset_explicit() pro vymazání citlivých dat
|
memcpy [53]
|
wmemcpy [54]
|
zkopíruje jeden buffer do druhého; od C23 bylo přidáno memccpy() na efektivně zřetězení řetězců
|
|
memmove [55]
|
wmemmove [56]
|
zkopíruje jeden buffer do druhého bufferu; buffery se mohou překrývat | |
memcmp [57]
|
wmemcmp [58]
|
porovná dva buffery (trojcestné porovnání) | |
memchr [59]
|
wmemchr [60]
|
vyhledá první výskyt bajtu v bufferu | |
Multibajtové funkce
Jméno | Popis |
---|---|
mblen [61]
|
vrátí počet bajtů v dalším multibajtovém znaku |
mbtowc [62]
|
zkonvertuje další multibajtový znak na široký znak |
wctomb [63]
|
zkonvertuje široký znak na jeho multibajtovou reprezentaci |
mbstowcs [64]
|
zkonvertuje multibajtový řetězec na široký řetězec |
wcstombs [65]
|
zkonvertuje široký řetězec na multibajtový řetězec |
btowc [66]
|
zkonvertuje jednobajtový znak na široký znak, pokud je to možné |
wctob [67]
|
zkonvertuje široký znak na jednobajtový znak, pokud je to možné |
mbsinit [68]
|
zkontroluje, pokud stav objektu reprezentuje počáteční stav |
mbrlen [69]
|
vrátí počet bajtů v dalším multibajtovém znaku; používá stav |
mbrtowc [70]
|
zkonvertuje další multibajtový znak na široký znak; používá stav |
wcrtomb [71]
|
zkonvertuje široký znak do jeho multibajtové reprezentace; používá stav |
mbsrtowcs [72]
|
zkonvertuje multibajtový řetězec na široký řetězec; používá stav |
wcsrtombs [73]
|
zkonvertuje široký řetězec na multibajtový řetězec; používá stav |
mbrtoc8 [74]
|
zkonvertuje další multibajtový znak na UTF-8 znak; používá stav |
c8rtomb [75]
|
zkonvertuje jeden kódový bod z UTF-8 do reprezentace úzkým multibajtovým znakem; používá stav |
mbrtoc16 [76]
|
zkonvertuje další multibajtový znak na UTF-16 znak; používá stav |
c16rtomb [77]
|
zkonvertuje jeden kódový bod z UTF-16 do reprezentace úzkým multibajtovým znakem; používá stav |
mbrtoc32 [78]
|
zkonvertuje další multibajtový znak na UTF-32 znak; používá stav |
c32rtomb [79]
|
zkonvertuje jeden kódový bod z UTF-32 do reprezentace úzkým multibajtovým znakem; používá stav |
Všechny tyto funkce potřebují objekt mbstate_t
, který byl původně ve statické paměti (kvůli čemuž tyto funkce nebyly vláknově bezpečné), v pozdějších verzích jej musí udržovat volající. Tento objekt měl původně udržovat stav v mb
kódování, ale moderní kódy, např. UTF-8, to nepotřebují. Tyto funkce však byly navrženy s předpokladem, že wc
kódování není kódování proměnné šířky a jsou proto navrženy tak, aby v každém okamžiku pracovaly právě s jedním wchar_t
a předávaly jej hodnotou, nikoli ukazatelem na řetězec. Protože UTF-16 je kódování proměnné šířky, bylo mbstate_t
znovu použito pro sledování náhradních párů v širokém kódování, i když volající musí stále detekovat a volat mbtowc
dvakrát pro každý znak.[80][81][82] Pozdější dodatky k normě připouštějí, že jediné konverze, které programátory zajímají, jsou mezi UTF-8 a UTF-16, a přímo je poskytují.
Numerické konverze
Bajtový řetězec |
Široký řetězec |
Popis[pozn. 2] |
---|---|---|
atof [83]
|
— | konvertuje řetězec na hodnotu v pohyblivé řádové čárce ('atof' znamená 'ASCII na float') |
atoi atol atoll [84]
|
— | konvertuje řetězec na celé číslo (C99) ('atoi' znamená 'ASCII na celé číslo') |
strtof (C99)[85]strtod [86]strtold (C99)[87]
|
wcstof (C99)[88]wcstod [89]wcstold (C99)[90]
|
konvertuje řetězec na hodnotu s pohyblivou řádovou čárkou |
strtol strtoll [91]
|
wcstol wcstoll [92]
|
konvertuje řetězec na celé číslo se znaménkem |
strtoul strtoull [93]
|
wcstoul wcstoull [94]
|
konvertuje řetězec na celé číslo bez znaménka |
Standardní knihovna jazyka C obsahuje několik funkcí pro konverze čísel. Funkce, které pracují s bajtovými řetězci, jsou deklarovány v hlavičkovém souboru stdlib.h
(cstdlib
v C++). Funkce, které pracují s širokými řetězci, jsou deklarovány v hlavičkovém souboru wchar.h
(cwchar
v C++).
Funkce strchr
, bsearch
, strpbrk
, strrchr
, strstr
, memchr
a jejich široké protějšky nejsou const-korektní, protože přijímají const
ukazatel na řetězec a vracejí nekonstantní ukazatel do řetězce. To bylo opraveno v C23.[95]
Od Normative Amendment 1 (C95) jsou také funkce atoxx
považovány za horší než funkce strtoxxx
(protože nerozlišují mezi chybou a 0
.[96]), a proto ani C95 ani žádná pozdější norma neobsahuje tyto funkce pro široké znaky.
Oblíbená rozšíření
Jméno | Zdroj | Popis |
---|---|---|
bzero [97][98]
|
BSD | vyplní buffer nulovými bajty, nahrazeno funkcí memset
|
memccpy [99]
|
SVID | od verze C23; kopírování mezi dvěma nepřekrývajícími se oblastmi paměti končí, je-li nalezen daný bajt. |
mempcpy [100]
|
GNU | varianta memcpy vracející ukazatel na bajt následující za posledním zapsaným bajtem
|
strcasecmp [101]
|
BSD | verze strcmp nerozlišující malá a velká písmena
|
strcat_s [102]
|
Windows | varianta strcat , která kontroluje cíl buffer velikost před kopírování
|
strcpy_s [103]
|
Windows | varianta strcpy , která kontroluje cíl buffer velikost před kopírování
|
strdup & strndup [104]
|
POSIX | od verze C23; alokuje paměť a řetězec zkopíruje do ní |
strerror_r [105]
|
POSIX 1, GNU | vláknově bezpečná verze funkce strerror . GNU verze je nekompatibilní s POSIXovou.
|
stricmp [106]
|
Windows |
strcmp bez rozlišování malých a velkých písmen
|
strlcpy [107]
|
BSD | varianta strcpy , která zkrátí výsledek, aby se vešel do cílového bufferu[108]
|
strlcat [107]
|
BSD | varianta strcat , která zkrátí výsledek, aby se vešel do cílového bufferu[108]
|
strsignal [109]
|
POSIX:2008 | vrátí řetězcovou reprezentaci signálu kód; není vláknově bezpečná |
strtok_r [110]
|
POSIX | varianta strtok , která je vláknově bezpečná
|
Náhrady
Přestože je dobře známo, že je třeba strcat
[22] a strcpy
[18] nahradit funkcemi, které nezpůsobují přetečení bufferu, do normy jazyka C nebyla přijata žádná jejich náhrada. Částečně je to způsobeno mylným přesvědčením mnoha programátorů, že se funkce strncat
a strncpy
chovají, jak mají; tyto funkce však nebyly navrženy pro práci s řetězci v bufferech různé délky (byly navrženy pro manipulace s řetězci doplněnými nulami v bufferech pevné délky, což je datový formát v moderním softwaru téměř nepoužívaný), jejich chování a parametry jsou neintuitivní, takže je často nesprávně používají i zkušení programátoři.[108]
Nejoblíbenější[pozn. 3] náhradou jsou funkce strlcat
[111] a strlcpy
,[112] které byly představeny v OpenBSD 2.4 v prosinci 1998.[108] Tyto funkce vždy ukončují řetězec v cílovém bufferu znakem NUL, v případě potřeby řetězec zkrátí, a vrací potřebnou velikost bufferu, což umožňuje zkrácení detekovat a případně vytvořit jiný buffer, do něhož by řetězec vešel celý. Implementace těchto funkcí s otevřeným zdrojovým textem byly dostupné,[113][114] ale dlouhou dobu nebyly součástí GNU C Library (glibc, používané softwarem na Linuxu), údajně kvůli své neefektivitě,[115] podpoře „neperspektivních“ řetězců z jazyka C,[116][117] a možnému skrývání jiných potenciálních chyb.[118][119]
Dokonce zatímco glibc nepřidala podporu, funkce strlcat
a strlcpy
byly implementovány v několika jiných knihovnách jazyka C včetně knihoven pro OpenBSD, FreeBSD, NetBSD, Solaris, OS X a QNX, i v alternativních knihovnách jazyka C pro Linux, např. do libbsd představené v roce 2008,[120] a musl, představené v roce 2011,[121][122] a jejich zdrojový kód byl přidáván přímo k jiným projektům, jako SDL, GLib, ffmpeg, Rsync, a dokonce interně do Linuxového jádra.
V roce 2024 byl kód funkcí strlcpy
a strlcat
přidán do glibc 2.38, jak zmiňují glibc FAQ (kód byl začleněn[123] a přijat[124]). Funkce byly zahrnuty do normy POSIX[125], jak zaznamenává Austin Group Defect Tracker .
I pro práci s řetězci zakončenými nulovým znakem se někdy používají funkce memcpy
[53] nebo memmove
[55], které mohou být efektivnější než strcpy
, protože opakovaně nekontrolují znak NUL (na moderních procesorech to nemusí být vždy pravda). Jako parametr dostávají délku bufferu, a jeho správná hodnota zabrání přetečení bufferu.
Microsoft představil jako část svého Microsoft Security Development Lifecycle (SDL) v roce 2004 rodinu „bezpečných“ funkcí, která kromě mnoha dalších zahrnuje strcpy_s
a strcat_s
.[126] Tyto funkce byly s určitými menšími změnami standardizovány jako část nepovinné C11 (Příloha K), které byly navrženy v ISO/IEC WDTR 24731.[127] Tyto funkce provádějí různé kontroly, včetně kontroly, zda řetězec není příliš dlouhý, aby se vešel do bufferu. Pokud kontrola selže, vyvolá se uživatelem definovaný „runtime-constraint handler“,[128] který obvykle ukončí provádění programu.[129][130] Tyto funkce vyvolaly značnou kritiku, protože zpočátku byly implementovány pouze ve Windows a zároveň se v prostředí Microsoft Visual C++ začala vypisovat varování doporučující použití těchto funkcí místo standardních. Někteří lidé proto spekulovali, že to byl pokus Microsoftu uzamknout vývojáře na své platformě.[131] Zkušenosti s těmito funkcemi ukázaly značné problémy s jejich přijetím a chyby při používání, a proto bylo pro další revizi normy jazyka C navrženo odstranění Přílohy K.[132] Doporučuje se také používat funkci memset_s
, aby se překladači zabránilo provádět nežádoucí optimalizace.[133][134]
Odkazy
Poznámky
Reference
V tomto článku byl použit překlad textu z článku C string handling na anglické Wikipedii.
- ↑ a b c The C99 standard draft + TC3 [online]. §7.1.1p1: [cit. 2011-01-07]. Dostupné online.
- ↑ The C99 standard draft + TC3 [online]. §6.4.5p7: [cit. 2011-01-07]. Dostupné online.
- ↑ The C99 standard draft + TC3 [online]. Section 6.4.5 footnote 66: [cit. 2011-01-07]. Dostupné online.
- ↑ Relax requirements on wchar_t to match existing practices [online]. Dostupné online.
- ↑ Fundamental types [online]. en.cppreference.com. Dostupné online.
- ↑ The C99 standard draft + TC3 [online]. §5.1.1.2 Translation phases, p1: [cit. 2011-12-23]. Dostupné online.
- ↑ string literals [online]. en.cppreference.com [cit. 2019-12-23]. Dostupné online.
- ↑ c++ - What is the use of wchar_t in general programming? [online]. Stack Overflow [cit. 2022-08-01]. Dostupné online. (anglicky)
- ↑ stddef.h - standard type definitions [online]. The Open Group [cit. 2017-01-28]. Dostupné online.
- ↑ GILLAM, Richard, 2003. Unicode Demystified: A Practical Programmer's Guide to the Encoding Standard. [s.l.]: Addison-Wesley Professional. Dostupné online. ISBN 9780201700527. S. 714.
- ↑ char, wchar_t, char8_t, char16_t, char32_t [online]. docs.microsoft.com [cit. 2022-08-01]. Dostupné online. (anglicky)
- ↑ char8_t [online]. Dostupné online.
- ↑ a b <cuchar> (uchar.h) [online]. Dostupné online. (anglicky)
- ↑ char16_t [online]. Dostupné online.
- ↑ a b Replacing text macros [online]. Dostupné online.
- ↑ a b Fundamental types [online]. Dostupné online.
- ↑ char32_t [online]. Dostupné online.
- ↑ a b strcpy - cppreference.com [online]. En.cppreference.com, 2014-01-02 [cit. 2014-03-06]. Dostupné online.
- ↑ wcscpy - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ strncpy - cppreference.com [online]. En.cppreference.com, 2013-10-04 [cit. 2014-03-06]. Dostupné online.
- ↑ wcsncpy - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ a b strcat - cppreference.com [online]. En.cppreference.com, 2013-10-08 [cit. 2014-03-06]. Dostupné online.
- ↑ wcscat - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ strncat - cppreference.com [online]. En.cppreference.com, 2013-07-01 [cit. 2014-03-06]. Dostupné online.
- ↑ wcsncat - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ strxfrm - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ wcsxfrm - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ strlen - cppreference.com [online]. En.cppreference.com, 2013-12-27 [cit. 2014-03-06]. Dostupné online.
- ↑ wcslen - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ strcmp - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ wcscmp - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ strncmp - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ wcsncmp - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ strcoll - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ wcscoll - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ strchr - cppreference.com [online]. En.cppreference.com, 2014-02-23 [cit. 2014-03-06]. Dostupné online.
- ↑ wcschr - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ strrchr - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ wcsrchr - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ strspn - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ wcsspn - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ strcspn - cppreference.com [online]. En.cppreference.com, 2013-05-31 [cit. 2014-03-06]. Dostupné online.
- ↑ wcscspn - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ strpbrk - cppreference.com [online]. En.cppreference.com, 2013-05-31 [cit. 2014-03-06]. Dostupné online.
- ↑ wcspbrk - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ strstr - cppreference.com [online]. En.cppreference.com, 2013-10-16 [cit. 2014-03-06]. Dostupné online.
- ↑ wcsstr - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ strtok - cppreference.com [online]. En.cppreference.com, 2013-09-03 [cit. 2014-03-06]. Dostupné online.
- ↑ wcstok - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ strerror - cppreference.com [online]. En.cppreference.com, 2013-05-31 [cit. 2014-03-06]. Dostupné online.
- ↑ memset - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ wmemset - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ a b memcpy - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ wmemcpy - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ a b memmove - cppreference.com [online]. En.cppreference.com, 2014-01-25 [cit. 2014-03-06]. Dostupné online.
- ↑ wmemmove - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ memcmp - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ wmemcmp - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ memchr - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ wmemchr - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ mblen - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ mbtowc - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ wctomb - cppreference.com [online]. En.cppreference.com, 2014-02-04 [cit. 2014-03-06]. Dostupné online.
- ↑ mbstowcs - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ wcstombs - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ btowc - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ wctob - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ mbsinit - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ mbrlen - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ mbrtowc - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ wcrtomb - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ mbsrtowcs - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ wcsrtombs - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ mbrtoc8 - cppreference.com [online]. En.cppreference.com. Dostupné online.
- ↑ c8rtomb - cppreference.com [online]. En.cppreference.com. Dostupné online.
- ↑ mbrtoc16 - cppreference.com [online]. En.cppreference.com. Dostupné online.
- ↑ c16rtomb - cppreference.com [online]. En.cppreference.com. Dostupné online.
- ↑ mbrtoc32 - cppreference.com [online]. En.cppreference.com. Dostupné online.
- ↑ c23rtomb - cppreference.com [online]. En.cppreference.com. Dostupné online.
- ↑ 6.3.2 Representing the state of the conversion [online]. The GNU C Library [cit. 2017-01-31]. Dostupné online.
- ↑ root/src/multibyte/c16rtomb.c [online]. [cit. 2017-01-31]. Dostupné online.
- ↑ Contents of /stable/11/lib/libc/locale/c16rtomb.c [online]. [cit. 2017-01-31]. Dostupné online.
- ↑ atof - cppreference.com [online]. En.cppreference.com, 2013-05-31 [cit. 2014-03-06]. Dostupné online.
- ↑ atoi, atol, atoll - cppreference.com [online]. En.cppreference.com, 2014-01-18 [cit. 2014-03-06]. Dostupné online.
- ↑ strtof, strtod, strtold - cppreference.com [online]. En.cppreference.com, 2014-02-04 [cit. 2014-03-06]. Dostupné online.
- ↑ strtof, strtod, strtold - cppreference.com [online]. En.cppreference.com, 2014-02-04 [cit. 2014-03-06]. Dostupné online.
- ↑ strtof, strtod, strtold - cppreference.com [online]. En.cppreference.com, 2014-02-04 [cit. 2014-03-06]. Dostupné online.
- ↑ wcstof, wcstod, wcstold - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ wcstof, wcstod, wcstold - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ wcstof, wcstod, wcstold - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ strtol, strtoll - cppreference.com [online]. En.cppreference.com, 2014-02-04 [cit. 2014-03-06]. Dostupné online.
- ↑ wcstol, wcstoll - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ strtoul, strtoull - cppreference.com [online]. En.cppreference.com, 2014-02-04 [cit. 2014-03-06]. Dostupné online.
- ↑ wcstoul, wcstoull - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online.
- ↑ WG14-N3020 : Qualifier-preserving standard library functions, v4 [online]. open-std.org, 2022-06-13. Dostupné online.
- ↑ C99 Rationale, 7.20.1.1
- ↑ bzero [online]. The Open Group [cit. 2017-11-27]. Dostupné online.
- ↑ bzero(3) [online]. OpenBSD [cit. 2017-11-27]. Dostupné online.
- ↑ memccpy [online]. Pubs.opengroup.org [cit. 2014-03-06]. Dostupné online.
- ↑ mempcpy(3) - Linux manual page [online]. Kernel.org [cit. 2014-03-06]. Dostupné online.
- ↑ strcasecmp(3) - Linux manual page [online]. Kernel.org [cit. 2014-03-06]. Dostupné online.
- ↑ strcat_s, wcscat_s, _mbscat_s [online]. docs.microsoft.com [cit. 2022-04-22]. Dostupné online.
- ↑ strcpy_s, wcscpy_s, _mbscpy_s, _mbscpy_s_l [online]. docs.microsoft.com [cit. 2022-04-22]. Dostupné online.
- ↑ strdup [online]. Pubs.opengroup.org [cit. 2014-03-06]. Dostupné online.
- ↑ strerror(3) - Linux manual page [online]. man7.org [cit. 2019-11-03]. Dostupné online.
- ↑ String | stricmp() [online]. C Programming Expert.com [cit. 2014-03-06]. Dostupné online.
- ↑ a b strlcpy, strlcat — size-bounded string copying and concatenation [online]. OpenBSD [cit. 2016-05-26]. Dostupné online.
- ↑ a b c d Todd C. Miller; Theo de Raadt, 1999. strlcpy and strlcat – consistent, safe, string copy and concatenation. [online]. USENIX '99, 1999. Dostupné online.
- ↑ strsignal [online]. Pubs.opengroup.org [cit. 2014-03-06]. Dostupné online.
- ↑ strtok [online]. Pubs.opengroup.org [cit. 2014-03-06]. Dostupné online.
- ↑ MILLER, Todd C. Dostupné online.
- ↑ MILLER, Todd C. Dostupné online.
- ↑ Todd C. Miller. strlcpy.c [online]. BSD Cross Reference. Dostupné online.
- ↑ Todd C. Miller. strlcat.c [online]. BSD Cross Reference. Dostupné online.
- ↑ MILLER, Damien. Secure Portability [online]. October 2005 [cit. 2016-06-26]. Toto [strlcpy a strlcat] API bylo převzato většinou moderních operačních systémů a mnoha samostatnými softwarovými balíčky [...]. Významnou výjimkou je GNU libc, glibc, jejíž maintainer neustále odmítají zahrnout tato vylepšená API, a označují je za „strašně neefektivní BSD šmejd“, bez ohledu na existující důkazy, že jsou ve většině případů rychlejší než API, která nahrazují.. Dostupné online.
- ↑ libc-alpha mailing list Archivováno 6. 4. 2012 na Wayback Machine., selected messages from 8 August 2000 thread: 53, 60, 61
- ↑ The ups and downs of strlcpy(); LWN.net
- ↑ Adding strlcpy() to glibc [online]. lwn.net. Správná práce s řetězci znamená, že vždy víte, jak dlouhé řetězce jsou, a proto je možné je kopírovat pomocí memcpy (místo strcpy).. Dostupné online.
- ↑ – Šablona:Man/ManKier "Lze však pochybovat o správnosti takové optimalizace, protože popírá celý účel funkcí strlcpy() a strlcat(). Ve skutečnosti se první verze této příručkové stránky mýlila."
- ↑ libbsd [online]. [cit. 2022-11-21]. Dostupné online.
- ↑ root/src/string/strlcpy.c [online]. [cit. 2017-01-28]. Dostupné online.
- ↑ root/src/string/strlcat.c [online]. [cit. 2017-01-28]. Dostupné online.
- ↑ strlc{py|at} commit
- ↑ Strlcpy and strlcat added to glibc 2.38 [online]. [cit. 2024-10-02]. Dostupné online.
- ↑ strlcat [online]. Pubs.opengroup.org [cit. 2024-09-05]. Dostupné online.
- ↑ LOVELL, Martyn. Repel Attacks on Your Code with the Visual Studio 2005 Safe C and C++ Libraries [online]. [cit. 2015-02-13]. Dostupné online.
- ↑ Safe C Library. The Safe C Library provides bound checking memory and string functions per ISO/IEC TR24731 [online]. Sourceforge [cit. 2013-03-06]. Dostupné online.
- ↑ The C11 standard draft [online]. §K.3.1.4p2: [cit. 2013-02-13]. Dostupné online.
- ↑ The C11 standard draft [online]. §K.3.6.1.1p4: [cit. 2013-02-13]. Dostupné online.
- ↑ Parameter Validation [online]. 2022-10-21. Dostupné online.
- ↑ Danny Kalev. They're at it again [online]. InformIT [cit. 2011-11-10]. Dostupné v archivu pořízeném dne 2012-01-15.
- ↑ Field Experience With Annex K — Bounds Checking Interfaces [online]. [cit. 2015-11-05]. Dostupné online.
- ↑ MSC06-C. Beware of compiler optimizations [online]. SEI CERT C Coding Standard. Dostupné online.
- ↑ manuálová stránka FreeBSD (knihovní funkce) –
Související články
- Syntaxe jazyka C#Řetězce syntaxe řetězců ve zdrojovém kódu, včetně escape posloupností začínajících zpětným lomítkem
- Perl Compatible Regular Expressions (PCRE)
Externí odkazy
- Kategorie C Programming/Strings ve Wikiknihách
- Fast memcpy in C, několik příkladů kódu funkce memcpy z jazyka C pro různé typy instrukčních architektur procesoru
Šablona:Jazyk C