Přeskočit na obsah

Práce s řetězci v jazyce C

Z Wikipedie, otevřené encyklopedie

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ým „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.

Ř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 v řetězci nemohou být obsaženy znaky s kódem nula. 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 zapotřebí i 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] jejichž kódová jednotka je typu wchar_t, který má na moderních strojích velikost 16 nebo 32 bitů. Tento typ byl vhodný pro 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 (zapisované ve zdrojovém kódu v jazyce C jako "abc") se při překladu konvertují na pole.[2] Výsledkem je pole kódových jednotek obsahující jednotlivé znaky zakončené nulovou kódovou jednotkou. Zápis L"text" v C90 produkuje široký řetězec. V řetězcovém literálu může být použita kódová jednotka nula (zapsaná např. \0), která však způsobí ukončení řetězce v daném místě. Zbytek literálu bude sice uložen do paměti (i s 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ů

[editovat | editovat zdroj]

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ém 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. Bajtové řetězce se často používají pro kódování UTF-8 a Shift JIS, a široké řetězce s 16bitovým wchar_t se často používá pro UTF-16; v obou případech může být jeden znak tvořen více než jednou kódovou jednotkou. Pokud je takový řetězec zkrácen funkcí jako je strncpy, může na jeho konci vzniknout neúplný znak, což může být problém, pokud jsou ř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

[editovat | editovat zdroj]

Terminologie

[editovat | editovat zdroj]

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

[editovat | editovat zdroj]

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. Při nesprávném použití však mohou způsobovat přetečení bufferu nebo jiné bezpečnostní problémy. Proto někteří programátoři dávají přednost bezpečnějším ale méně přenositelným alternativám, z nichž některé oblíbené jsou uvedeny níže. Některé z funkcí také porušují const-korektnost tím, že přijímají ukazatel na const řetězec a vracejí nekonstantní ukazatel do řetězce. 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

[editovat | editovat zdroj]
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, používá se char16_t na tomto systému pro UTF-16. 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 má makro __STDC_UTF_32__ hodnotu 1, používá se na tomto systému char32_t pro UTF-32. To platí v C23 vždy.[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í.
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

[editovat | editovat zdroj]
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

[editovat | editovat zdroj]
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í

[editovat | editovat zdroj]
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á

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 jiných obsahuje strcpy_s a strcat_s.[126] Tyto funkce byly s určitými menšími změnami standardizovány jako část nepovinné Přílohy K normy C11, která byla navržena v ISO/IEC WDTR 24731.[127] Tyto funkce provádějí různé kontroly, včetně kontroly, zda se řetězec vejde do bufferu. Pokud tomu tak není, 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]

  1. U funkcí pro široké řetězce nahraďte v popisu slovo „bajt“ za „wchar_t
  2. Řetězec zde znamená buď bajtový nebo široký řetězec
  3. Na GitHubu existuje 7 813 206 použití strlcpy a 38 644 použití strcpy_s (a 15 286 150 použití strcpy).[zdroj?]

V tomto článku byl použit překlad textu z článku C string handling na anglické Wikipedii.

  1. a b c The C99 standard draft + TC3 [online]. §7.1.1p1: [cit. 2011-01-07]. Dostupné online. 
  2. The C99 standard draft + TC3 [online]. §6.4.5p7: [cit. 2011-01-07]. Dostupné online. 
  3. The C99 standard draft + TC3 [online]. Section 6.4.5 footnote 66: [cit. 2011-01-07]. Dostupné online. 
  4. Relax requirements on wchar_t to match existing practices [online]. Dostupné online. 
  5. Fundamental types [online]. en.cppreference.com. Dostupné online. 
  6. The C99 standard draft + TC3 [online]. §5.1.1.2 Translation phases, p1: [cit. 2011-12-23]. Dostupné online. 
  7. string literals [online]. en.cppreference.com [cit. 2019-12-23]. Dostupné online. 
  8. c++ - What is the use of wchar_t in general programming? [online]. Stack Overflow [cit. 2022-08-01]. Dostupné online. (anglicky) 
  9. stddef.h - standard type definitions [online]. The Open Group [cit. 2017-01-28]. Dostupné online. 
  10. 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. 
  11. char, wchar_t, char8_t, char16_t, char32_t [online]. docs.microsoft.com [cit. 2022-08-01]. Dostupné online. (anglicky) 
  12. char8_t [online]. Dostupné online. 
  13. a b <cuchar> (uchar.h) [online]. Dostupné online. (anglicky) 
  14. char16_t [online]. Dostupné online. 
  15. a b Replacing text macros [online]. Dostupné online. 
  16. a b Fundamental types [online]. Dostupné online. 
  17. char32_t [online]. Dostupné online. 
  18. a b strcpy - cppreference.com [online]. En.cppreference.com, 2014-01-02 [cit. 2014-03-06]. Dostupné online. 
  19. wcscpy - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  20. strncpy - cppreference.com [online]. En.cppreference.com, 2013-10-04 [cit. 2014-03-06]. Dostupné online. 
  21. wcsncpy - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  22. a b strcat - cppreference.com [online]. En.cppreference.com, 2013-10-08 [cit. 2014-03-06]. Dostupné online. 
  23. wcscat - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  24. strncat - cppreference.com [online]. En.cppreference.com, 2013-07-01 [cit. 2014-03-06]. Dostupné online. 
  25. wcsncat - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  26. strxfrm - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  27. wcsxfrm - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  28. strlen - cppreference.com [online]. En.cppreference.com, 2013-12-27 [cit. 2014-03-06]. Dostupné online. 
  29. wcslen - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  30. strcmp - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  31. wcscmp - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  32. strncmp - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  33. wcsncmp - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  34. strcoll - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  35. wcscoll - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  36. strchr - cppreference.com [online]. En.cppreference.com, 2014-02-23 [cit. 2014-03-06]. Dostupné online. 
  37. wcschr - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  38. strrchr - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  39. wcsrchr - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  40. strspn - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  41. wcsspn - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  42. strcspn - cppreference.com [online]. En.cppreference.com, 2013-05-31 [cit. 2014-03-06]. Dostupné online. 
  43. wcscspn - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  44. strpbrk - cppreference.com [online]. En.cppreference.com, 2013-05-31 [cit. 2014-03-06]. Dostupné online. 
  45. wcspbrk - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  46. strstr - cppreference.com [online]. En.cppreference.com, 2013-10-16 [cit. 2014-03-06]. Dostupné online. 
  47. wcsstr - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  48. strtok - cppreference.com [online]. En.cppreference.com, 2013-09-03 [cit. 2014-03-06]. Dostupné online. 
  49. wcstok - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  50. strerror - cppreference.com [online]. En.cppreference.com, 2013-05-31 [cit. 2014-03-06]. Dostupné online. 
  51. memset - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  52. wmemset - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  53. a b memcpy - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  54. wmemcpy - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  55. a b memmove - cppreference.com [online]. En.cppreference.com, 2014-01-25 [cit. 2014-03-06]. Dostupné online. 
  56. wmemmove - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  57. memcmp - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  58. wmemcmp - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  59. memchr - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  60. wmemchr - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  61. mblen - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  62. mbtowc - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  63. wctomb - cppreference.com [online]. En.cppreference.com, 2014-02-04 [cit. 2014-03-06]. Dostupné online. 
  64. mbstowcs - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  65. wcstombs - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  66. btowc - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  67. wctob - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  68. mbsinit - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  69. mbrlen - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  70. mbrtowc - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  71. wcrtomb - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  72. mbsrtowcs - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  73. wcsrtombs - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  74. mbrtoc8 - cppreference.com [online]. En.cppreference.com. Dostupné online. 
  75. c8rtomb - cppreference.com [online]. En.cppreference.com. Dostupné online. 
  76. mbrtoc16 - cppreference.com [online]. En.cppreference.com. Dostupné online. 
  77. c16rtomb - cppreference.com [online]. En.cppreference.com. Dostupné online. 
  78. mbrtoc32 - cppreference.com [online]. En.cppreference.com. Dostupné online. 
  79. c23rtomb - cppreference.com [online]. En.cppreference.com. Dostupné online. 
  80. 6.3.2 Representing the state of the conversion [online]. The GNU C Library [cit. 2017-01-31]. Dostupné online. 
  81. root/src/multibyte/c16rtomb.c [online]. [cit. 2017-01-31]. Dostupné online. 
  82. Contents of /stable/11/lib/libc/locale/c16rtomb.c [online]. [cit. 2017-01-31]. Dostupné online. 
  83. atof - cppreference.com [online]. En.cppreference.com, 2013-05-31 [cit. 2014-03-06]. Dostupné online. 
  84. atoi, atol, atoll - cppreference.com [online]. En.cppreference.com, 2014-01-18 [cit. 2014-03-06]. Dostupné online. 
  85. strtof, strtod, strtold - cppreference.com [online]. En.cppreference.com, 2014-02-04 [cit. 2014-03-06]. Dostupné online. 
  86. strtof, strtod, strtold - cppreference.com [online]. En.cppreference.com, 2014-02-04 [cit. 2014-03-06]. Dostupné online. 
  87. strtof, strtod, strtold - cppreference.com [online]. En.cppreference.com, 2014-02-04 [cit. 2014-03-06]. Dostupné online. 
  88. wcstof, wcstod, wcstold - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  89. wcstof, wcstod, wcstold - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  90. wcstof, wcstod, wcstold - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  91. strtol, strtoll - cppreference.com [online]. En.cppreference.com, 2014-02-04 [cit. 2014-03-06]. Dostupné online. 
  92. wcstol, wcstoll - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  93. strtoul, strtoull - cppreference.com [online]. En.cppreference.com, 2014-02-04 [cit. 2014-03-06]. Dostupné online. 
  94. wcstoul, wcstoull - cppreference.com [online]. En.cppreference.com [cit. 2014-03-06]. Dostupné online. 
  95. WG14-N3020 : Qualifier-preserving standard library functions, v4 [online]. open-std.org, 2022-06-13. Dostupné online. 
  96. C99 Rationale, 7.20.1.1
  97. bzero [online]. The Open Group [cit. 2017-11-27]. Dostupné online. 
  98. bzero(3) [online]. OpenBSD [cit. 2017-11-27]. Dostupné online. 
  99. memccpy [online]. Pubs.opengroup.org [cit. 2014-03-06]. Dostupné online. 
  100. mempcpy(3) - Linux manual page [online]. Kernel.org [cit. 2014-03-06]. Dostupné online. 
  101. strcasecmp(3) - Linux manual page [online]. Kernel.org [cit. 2014-03-06]. Dostupné online. 
  102. strcat_s, wcscat_s, _mbscat_s [online]. docs.microsoft.com [cit. 2022-04-22]. Dostupné online. 
  103. strcpy_s, wcscpy_s, _mbscpy_s, _mbscpy_s_l [online]. docs.microsoft.com [cit. 2022-04-22]. Dostupné online. 
  104. strdup [online]. Pubs.opengroup.org [cit. 2014-03-06]. Dostupné online. 
  105. strerror(3) - Linux manual page [online]. man7.org [cit. 2019-11-03]. Dostupné online. 
  106. String | stricmp() [online]. C Programming Expert.com [cit. 2014-03-06]. Dostupné online. 
  107. a b strlcpy, strlcat — size-bounded string copying and concatenation [online]. OpenBSD [cit. 2016-05-26]. Dostupné online. 
  108. 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. 
  109. strsignal [online]. Pubs.opengroup.org [cit. 2014-03-06]. Dostupné online. 
  110. strtok [online]. Pubs.opengroup.org [cit. 2014-03-06]. Dostupné online. 
  111. MILLER, Todd C. Dostupné online. 
  112. MILLER, Todd C. Dostupné online. 
  113. Todd C. Miller. strlcpy.c [online]. BSD Cross Reference. Dostupné online. 
  114. Todd C. Miller. strlcat.c [online]. BSD Cross Reference. Dostupné online. 
  115. 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. 
  116. libc-alpha mailing list Archivováno 6. 4. 2012 na Wayback Machine., selected messages from 8 August 2000 thread: 53, 60, 61
  117. The ups and downs of strlcpy(); LWN.net
  118. 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. 
  119. [[[:Šablona:Man/ManKier]] strlcpy(Šablona:Man/ManKier)] – Š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."
  120. libbsd [online]. [cit. 2022-11-21]. Dostupné online. 
  121. root/src/string/strlcpy.c [online]. [cit. 2017-01-28]. Dostupné online. 
  122. root/src/string/strlcat.c [online]. [cit. 2017-01-28]. Dostupné online. 
  123. strlc{py|at} commit
  124. Strlcpy and strlcat added to glibc 2.38 [online]. [cit. 2024-10-02]. Dostupné online. 
  125. strlcat [online]. Pubs.opengroup.org [cit. 2024-09-05]. Dostupné online. 
  126. LOVELL, Martyn. Repel Attacks on Your Code with the Visual Studio 2005 Safe C and C++ Libraries [online]. [cit. 2015-02-13]. Dostupné online. 
  127. 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. 
  128. The C11 standard draft [online]. §K.3.1.4p2: [cit. 2013-02-13]. Dostupné online. 
  129. The C11 standard draft [online]. §K.3.6.1.1p4: [cit. 2013-02-13]. Dostupné online. 
  130. Parameter Validation [online]. 2022-10-21. Dostupné online. 
  131. Danny Kalev. They're at it again [online]. InformIT [cit. 2011-11-10]. Dostupné v archivu pořízeném dne 2012-01-15. 
  132. Field Experience With Annex K — Bounds Checking Interfaces [online]. [cit. 2015-11-05]. Dostupné online. 
  133. MSC06-C. Beware of compiler optimizations [online]. SEI CERT C Coding Standard. Dostupné online. 
  134. memset_s(3) – manuálová stránka FreeBSD (knihovní funkce)

Související články

[editovat | editovat zdroj]

Externí odkazy

[editovat | editovat zdroj]