Zpracování řetězce C. - C string handling - Wikipedia
C standardní knihovna |
---|
Obecná témata |
Různé záhlaví |
The C programovací jazyk má sadu funkcí implementujících operace na struny (řetězce znaků a bajtové řetězce) standardní knihovna. Různé operace, jako je kopírování, zřetězení, tokenizace a vyhledávání je podporováno. U řetězců znaků používá standardní knihovna konvenci, kterou řetězce jsou zakončeno nulou: řetězec n znaky jsou reprezentovány jako pole z n + 1 prvky, z nichž poslední je znak „NUL“.
Jedinou podporou pro řetězce ve vlastním programovacím jazyce je, že překladač překládá citované řetězcové konstanty do řetězců zakončených nulou.
Definice
Řetězec je definován jako souvislá posloupnost kódové jednotky ukončen první jednotkou nulového kódu (často nazývanou NUL kódová jednotka).[1] To znamená, že řetězec nemůže obsahovat jednotku nulového kódu, protože první viděný označuje konec řetězce. The délka řetězce je počet kódových jednotek před nulovou kódovou jednotkou.[1] Paměť obsazená řetězcem je vždy o jednu kódovou jednotku větší než délka, protože k uložení nulového terminátoru je potřeba místo.
Obecně termín tětiva znamená řetězec, kde je kódová jednotka typu char
, což je přesně 8 bitů na všech moderních strojích. C90 definuje široké struny[1] které používají kódovou jednotku typu wchar_t
, což je 16 nebo 32 bitů na moderních strojích. To bylo určeno pro Unicode ale stále častěji se používá UTF-8 místo toho v normálních řetězcích pro Unicode.
Řetězce se předávají funkcím předáním ukazatele na první jednotku kódu. Od té doby char *
a wchar_t *
jsou různé typy, funkce, které zpracovávají široké řetězce, se liší od těch, které zpracovávají normální řetězce, a mají různé názvy.
Řetězcové literály ("text"
ve zdrojovém kódu C) jsou během kompilace převedeny na pole.[2] Výsledkem je pole kódových jednotek obsahující všechny znaky plus koncová nulová kódová jednotka. V C90 L „text“
vytvoří široký řetězec. Řetězcový literál může obsahovat jednotku nulového kódu (jedním ze způsobů je dát \0
do zdroje), ale to způsobí, že řetězec v tomto bodě skončí. Zbytek literálu bude umístěn do paměti (s další nulovou jednotkou kódu přidanou na konec), ale je nemožné vědět, že tyto jednotky kódu byly přeloženy z řetězcového literálu, proto je takový zdrojový kód ne řetězcový literál.[3]
Kódování znaků
Každý řetězec končí prvním výskytem jednotky nulového kódu příslušného druhu (char
nebo wchar_t
). V důsledku toho je bajtový řetězec (char *
) může obsahovat ne-NUL znaků v ASCII nebo nějaký Rozšíření ASCII, ale ne znaky v kódování, jako je UTF-16 (i když 16bitová kódová jednotka může být nenulová, její horní nebo nízký bajt může být nulový). Kódování, která lze uložit do širokých řetězců, jsou definována šířkou wchar_t
. Ve většině implementací wchar_t
je alespoň 16 bitů, a tak všechna 16bitová kódování, jako např UCS-2, lze uložit. Li wchar_t
je 32bitové, pak 32bitové kódování, například UTF-32, lze uložit. (Norma vyžaduje „typ, který obsahuje jakýkoli široký znak“, který ve Windows již neplatí, protože se posunul UCS-2 na UTF-16.) C ++ 11 a C11 přidávají dva typy s explicitní šířkou char16_t
a char32_t
.[4]
Kódování s proměnnou šířkou lze použít jak v bajtových řetězcích, tak v širokých řetězcích. Délka řetězce a posuny se měří v bajtech nebo wchar_t
, nikoli „znaky“, což může být pro začínající programátory matoucí. UTF-8 a Shift JIS se často používají v řetězcích C byte, zatímco UTF-16 se často používá v řetězcích C wide, když wchar_t
je 16 bitů. Zkrácení řetězců se znaky s proměnnou délkou pomocí funkcí jako strncpy
může vytvářet neplatné sekvence na konci řetězce. To může být nebezpečné, pokud jsou zkrácené části interpretovány kódem, který předpokládá, že vstup je platný.
Podpora literálů Unicode, jako je char foo [512] = "φωωβαρ";
(UTF-8) nebo wchar_t foo [512] = L "φωωβαρ";
(UTF-16 nebo UTF-32, záleží na wchar_t
) je implementace definována,[5] a může vyžadovat, aby zdrojový kód byl ve stejném kódování, zejména pro char
kde kompilátoři mohli jen kopírovat cokoli mezi uvozovkami. Někteří kompilátoři nebo editoři budou vyžadovat zadání všech znaků jiných než ASCII jako xNN
sekvence pro každý bajt UTF-8 a / nebo uNNNN
pro každé slovo UTF-16. Od C11 (a C ++ 11), nový char foo [512] = u8 "φωωβαρ";
K dispozici je doslovná syntaxe, která zaručuje UTF-8 pro bytestring literál.[6]
Přehled funkcí
Většina funkcí, které pracují na řetězcích C, je deklarována v řetězec.h
záhlaví (cstring
v C ++), zatímco funkce, které pracují na řetězcích C wide, jsou deklarovány v wchar.h
záhlaví (cwchar
v C ++). Tyto záhlaví také obsahují deklarace funkcí použitých pro zpracování vyrovnávacích pamětí; název je tedy poněkud nesprávným pojmenováním.
Funkce deklarované v řetězec.h
jsou velmi populární, protože jako součást C standardní knihovna, je zaručeno, že budou fungovat na jakékoli platformě, která podporuje C. U těchto funkcí však existují určité problémy se zabezpečením, například potenciál přetečení vyrovnávací paměti pokud nejsou používány opatrně a správně, způsobují to, že programátoři upřednostňují bezpečnější a možná méně přenosné varianty, z nichž níže jsou uvedeny některé populární. Některé z těchto funkcí také porušují const-správnost přijetím a konst
řetězec ukazatel a vrácení non-konst
ukazatel v řetězci. Abychom to napravili, některé byly rozděleny na dvě části přetížené funkce ve verzi standardní knihovny v C ++.
V historické dokumentaci se často používal výraz „znak“ místo „byte“ pro řetězce C, což vede mnoho[SZO? ] věřit, že tyto funkce nějak nefungují UTF-8. Ve skutečnosti jsou všechny délky definovány jako v bajtech a to platí ve všech implementacích a tyto funkce fungují stejně dobře s UTF-8 jako s jednobajtovým kódováním. Dokumentace BSD byla opravena, aby to bylo jasné, ale dokumentace POSIX, Linux a Windows stále používá „znak“ na mnoha místech, kde „bajt“ nebo „wchar_t“ je správný termín.
Funkce pro zpracování vyrovnávacích pamětí mohou zpracovávat sekvence bajtů, které obsahují nullbajt jako součást dat. Názvy těchto funkcí obvykle začínají mem
, na rozdíl od str
předpona.
Konstanty a typy
název | Poznámky |
---|---|
NULA | Makro se rozšiřuje na nulový ukazatel konstantní; tj. konstanta představující hodnotu ukazatele, která je zaručena ne být platnou adresou objektu v paměti. |
wchar_t | Typ používaný pro jednotku kódu v širokých řetězcích, obvykle 16bitová nebo 32bitová hodnota bez znaménka. Pro tyto kódové jednotky není specifikována žádná konkrétní interpretace; standard C to vyžaduje pouze wchar_t být dostatečně široký, aby udržel nejširší znakovou sadu mezi podporovaným systémem národní prostředí.[7] Teoreticky wchar_t může mít stejnou velikost jako char, a tedy není schopen držet UTF-32 nebo UTF-16 kódové jednotky.[8] |
wint_t | Celočíselný typ, který může obsahovat jakoukoli hodnotu wchar_t i hodnotu makra WEOF. Tento typ se nezmění integrálními propagacemi. Obvykle 32bitová podepsaná hodnota. |
mbstate_t | Obsahuje všechny informace o stavu převodu požadovaném od jednoho volání funkce k druhému. |
Funkce
Byte tětiva | Široký tětiva | Popis[poznámka 1] | |
---|---|---|---|
Tětiva manipulace | strcpy [9] | wcscpy [10] | Zkopíruje jeden řetězec do druhého |
strncpy [11] | wcsncpy [12] | Píše přesně n bajtů, kopírování ze zdroje nebo přidání nuly | |
strcat [13] | wcscat [14] | Připojí jeden řetězec k druhému | |
strncat [15] | wcsncat [16] | Připojuje ne více než n bajtů z jednoho řetězce do druhého | |
strxfrm [17] | wcsxfrm [18] | Transformuje řetězec podle aktuálního národního prostředí | |
Tětiva zkouška | strlen [19] | wcslen [20] | Vrátí délku řetězce |
strcmp [21] | wcscmp [22] | Porovná dva řetězce (třícestné srovnání ) | |
strncmp [23] | wcsncmp [24] | Porovná konkrétní počet bajtů ve dvou řetězcích | |
strcoll [25] | wcscoll [26] | Porovná dva řetězce podle aktuálního národního prostředí | |
strchr [27] | wcschr [28] | Najde první výskyt bajtu v řetězci | |
strrchr [29] | wcsrchr [30] | Najde poslední výskyt bajtu v řetězci | |
strspn [31] | wcsspn [32] | Vrátí počet počátečních bajtů v řetězci, které jsou v druhém řetězci | |
strcspn [33] | wcscspn [34] | Vrátí počet počátečních bajtů v řetězci, které nejsou v druhém řetězci | |
strpbrk [35] | wcspbrk [36] | Najde v řetězci první výskyt bajtu v sadě | |
strstr [37] | wcsstr [38] | Najde první výskyt podřetězce v řetězci | |
strtok [39] | wcstok [40] | Rozdělí řetězec na žetony | |
Smíšený | strerror [41] | N / A | Vrátí řetězec obsahující zprávu odvozenou z chybový kód |
Paměť manipulace | pamětová sada [42] | wmemset [43] | Vyplní vyrovnávací paměť opakovaným bajtem |
memcpy [44] | wmemcpy [45] | Zkopíruje jednu vyrovnávací paměť do druhé | |
memmove [46] | wmemmove [47] | Zkopíruje jednu vyrovnávací paměť do druhé, případně překrývající se vyrovnávací paměti | |
memcmp [48] | wmemcmp [49] | Porovnává dvě vyrovnávací paměti (třícestné srovnání) | |
memchr [50] | wmemchr [51] | Najde první výskyt bajtu ve vyrovnávací paměti | |
|
Vícebajtové funkce
název | Popis |
---|---|
mblen [52] | Vrátí počet bajtů v dalším vícebajtovém znaku |
mbtowc [53] | Převede další vícebajtový znak na široký znak |
wctomb [54] | Převede široký znak na jeho vícebajtovou reprezentaci |
mbstowcs [55] | Převede vícebajtový řetězec na široký řetězec |
wcstombs [56] | Převede široký řetězec na vícebajtový řetězec |
btowc [57] | Pokud je to možné, převeďte jednobajtový znak na široký znak |
wctob [58] | Pokud je to možné, převeďte široký znak na jednobajtový znak |
mbsinit [59] | Zkontroluje, zda objekt stavu představuje počáteční stav |
mbrlen [60] | Vrátí počet bajtů v dalším vícebajtovém znaku v daném stavu |
mbrtowc [61] | Převede další vícebajtový znak na široký znak v daném stavu |
wcrtomb [62] | Převede široký znak na jeho vícebajtovou reprezentaci v daném stavu |
mbsrtowcs [63] | Převede vícebajtový řetězec na široký řetězec v daném stavu |
wcsrtombs [64] | Převede široký řetězec na vícebajtový řetězec v daném stavu |
Všechny tyto funkce berou ukazatel na a mbstate_t objekt, který musí volající udržovat. To bylo původně zamýšleno ke sledování stavů posunu v EU mb kódování, ale moderní, jako je UTF-8, to nepotřebují. Tyto funkce však byly navrženy za předpokladu, že toaleta kódování není kódování s proměnnou šířkou a proto jsou navrženy tak, aby zvládly přesně jednu wchar_t najednou předáním podle hodnoty, než pomocí ukazatele řetězce. Protože UTF-16 je kódování s proměnnou šířkou, mbstate_t byl opakovaně použit ke 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 jeden znak.[65][66][67]
Numerické převody
Byte tětiva | Široký tětiva | Popis[poznámka 1] |
---|---|---|
atof [68] | N / A | převede řetězec na hodnotu s plovoucí desetinnou čárkou ('atof' znamená 'ASCII to float') |
atoi atol atol [69] | N / A | převede řetězec na celé číslo (C99 ) ('atoi' znamená 'ASCII na celé číslo') |
strtof (C99 )[70]strtod [71]strtold (C99 )[72] | wcstof (C99 )[73]wcstod [74]wcstold (C99 )[75] | převede řetězec na hodnotu s plovoucí desetinnou čárkou |
strtol strtoll [76] | wcstol wcstoll [77] | převede řetězec na celé číslo se znaménkem |
strtoul strtoull [78] | wcstoul wcstoull [79] | převede řetězec na celé číslo bez znaménka |
|
Standardní knihovna C obsahuje několik funkcí pro číselné převody. Funkce, které se zabývají bajtovými řetězci, jsou definovány v stdlib.h
záhlaví (cstdlib
záhlaví v C ++). Funkce, které se zabývají širokými řetězci, jsou definovány v wchar.h
záhlaví (cwchar
záhlaví v C ++).
The strtoxxx
funkce nejsou const-správný, protože přijímají a konst
řetězec ukazatel a vrátit non-konst
ukazatel v řetězci.
Od normativní změny 1 (C95) také atoxx
funkce jsou považovány za zahrnuty do strtoxxx
funkce, a proto ani C95, ani žádný pozdější standard neposkytuje širokopásmové verze těchto funkcí. Argument proti atoxx
je, že nerozlišují mezi chybou a 0
.[80]
Populární rozšíření
název | Plošina | Popis |
---|---|---|
bzero [81][82] | POSIX, BSD | Vyplní vyrovnávací paměť nulovými bajty, zastaralá pamětová sada |
memccpy [83] | SVID POSIX | kopíruje až zadaný počet bajtů mezi dvěma oblastmi paměti, které se nesmí překrývat, a zastaví se, když je nalezen daný bajt. |
mempcpy [84] | GNU | varianta memcpy vrácení ukazatele na bajt následující po posledním zapsaném bajtu |
strcasecmp [85] | POSIX, BSD | verze souboru bez rozlišení velkých a malých písmen strcmp |
strcat_s [86] | Okna | varianta strcat který před kopírováním zkontroluje velikost cílové vyrovnávací paměti |
strcpy_s [86] | Okna | varianta strcpy který před kopírováním zkontroluje velikost cílové vyrovnávací paměti |
Strdup [87] | POSIX | přiděluje a duplikuje řetězec |
strerror_r [88] | POSIX 1, GNU | varianta strerror to je bezpečné pro vlákna. Verze GNU je nekompatibilní s verzí POSIX. |
stricmp [89] | Okna | verze souboru bez rozlišení velkých a malých písmen strcmp |
strlcpy [90] | BSD, Solaris | varianta strcpy který zkrátí výsledek, aby se vešel do cílové vyrovnávací paměti[91] |
strlcat [90] | BSD, Solaris | varianta strcat který zkrátí výsledek, aby se vešel do cílové vyrovnávací paměti[91] |
strsignal [92] | POSIX: 2008 | vrací řetězcové vyjádření a signální kód. Není bezpečné pro vlákna. |
strtok_r [93] | POSIX | varianta strtok to je bezpečné pro vlákna |
Výměny
I přes zavedená potřeba nahradit strcat
[13] a strcpy
[9] s funkcemi, které neumožňují přetečení vyrovnávací paměti, nevznikla žádná přijatá norma. To je částečně způsobeno mylnou vírou mnoha programátorů C, že strncat
a strncpy
mít požadované chování; ani jedna z těchto funkcí však nebyla navržena (byly určeny k manipulaci s vyrovnávací pamětí řetězců pevné velikosti s pevnou velikostí, datový formát méně běžně používaný v moderním softwaru) a chování a argumenty jsou neintuitivní a často je nesprávně napsány dokonce i odborníkem programátoři.[91]
Nejpopulárnější[A] náhradní jsou strlcat
a strlcpy
funkce, které se objevily v OpenBSD 2.4 v prosinci 1998.[91] Tyto funkce vždy zapisují jeden NUL do cílové vyrovnávací paměti, v případě potřeby ořezávají výsledek a vracejí velikost vyrovnávací paměti, která by byla potřebná, což umožňuje detekci zkrácení a poskytuje velikost pro vytvoření nové vyrovnávací paměti, která se nezkrátí. Byli kritizováni na základě údajné neúčinnosti,[94] podpora používání řetězců C (místo nějaké lepší alternativní formy řetězce),[95][96] a skrývání dalších potenciálních chyb.[97][98] V důsledku toho nebyly zahrnuty do Knihovna GNU C. (používané softwarem v systému Linux), i když jsou implementovány v knihovnách C pro OpenBSD, FreeBSD, NetBSD, Solaris, OS X, a QNX, stejně jako v alternativních knihovnách C pro Linux, jako je musl představen v roce 2011.[99][100] Nedostatek podpory knihoven GNU C nezastavil různé autory softwaru v tom, aby ji používali a mimo jiné spojili náhradu SDL, GLib, ffmpeg, rsync, a to i interně v Linuxové jádro. K dispozici jsou implementace open source pro tyto funkce.[101][102]
Někdy memcpy
[44] nebo memmove
[46] jsou použity, protože mohou být účinnější než strcpy
protože opakovaně nekontrolují NUL (u moderních procesorů to platí méně). Protože potřebují jako parametr délku vyrovnávací paměti, správné nastavení tohoto parametru může zabránit přetečení vyrovnávací paměti.
V rámci roku 2004 Životní cyklus vývoje zabezpečení Microsoft představil rodinu "zabezpečených" funkcí včetně strcpy_s
a strcat_s
(spolu s mnoha dalšími).[103] Tyto funkce byly standardizovány s několika drobnými změnami jako součást volitelné výbavy C11 (příloha K) navrženo ISO / IEC WDTR 24731. Tyto funkce provádějí různé kontroly, včetně toho, zda je řetězec příliš dlouhý, aby se vešel do vyrovnávací paměti. Pokud kontroly selžou, volá se uživatelem zadaná funkce „obslužná rutina omezení běhu“,[104] což obvykle přeruší program.[105][106] Některé funkce provádějí destruktivní operace před voláním obslužné rutiny omezení běhu; například, strcat_s
nastaví cíl na prázdný řetězec,[107] což může ztěžovat zotavení z chybových podmínek nebo jejich ladění. Tyto funkce vzbudily značnou kritiku, protože zpočátku byly implementovány pouze v systému Windows a současně začaly být vytvářeny varovné zprávy Microsoft Visual C ++ což navrhuje programátorům používat tyto funkce místo standardních. Někteří spekulovali, že jde o pokus společnosti Microsoft zamknout vývojáře do své platformy.[108] Ačkoli jsou k dispozici implementace těchto funkcí typu open-source, tyto funkce nejsou v běžných knihovnách Unix C přítomny.[109] Zkušenosti s těmito funkcemi ukázaly značné problémy s jejich přijetím a chybami v používání, proto je navrženo odstranění přílohy K pro další revizi standardu C.[110] Využití memset_s
byl také navržen jako způsob, jak se vyhnout nežádoucí optimalizaci kompilátoru.[111][112]
Viz také
- C syntaxe § řetězce - syntaxe zdrojového kódu, včetně únikových sekvencí zpětného lomítka
- Řetězcové funkce
Poznámky
- ^ Na GitHubu existuje 7 813 206 použití
strlcpy
, oproti 38 644 použitímstrcpy_s
(a 15 286 150 použitístrcpy
).[Citace je zapotřebí ]
Reference
- ^ A b C „Standardní koncept C99 + TC3“ (PDF). §7.1.1p1. Citováno 7. ledna 2011.CS1 maint: umístění (odkaz)
- ^ „Standardní koncept C99 + TC3“ (PDF). §6.4.5p7. Citováno 7. ledna 2011.CS1 maint: umístění (odkaz)
- ^ „Standardní koncept C99 + TC3“ (PDF). Oddíl 6.4.5 poznámka pod čarou 66. Citováno 7. ledna 2011.CS1 maint: umístění (odkaz)
- ^ „Základní typy“. en.cppreference.com.
- ^ „Standardní koncept C99 + TC3“ (PDF). §5.1.1.2 Fáze překladu, str. Citováno 23. prosince 2011.CS1 maint: umístění (odkaz)
- ^ "řetězcové literály". en.cppreference.com. Citováno 23. prosince 2019.
- ^ "stddef.h - standardní definice typů". Otevřená skupina. Citováno 28. ledna 2017.
- ^ Gillam, Richard (2003). Unicode Demystified: Praktický programátorský průvodce standardem kódování. Addison-Wesley Professional. str. 714. ISBN 9780201700527.
- ^ A b „strcpy - cppreference.com“. En.cppreference.com. 2. ledna 2014. Citováno 6. března 2014.
- ^ „wcscpy - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „strncpy - cppreference.com“. En.cppreference.com. 4. října 2013. Citováno 6. března 2014.
- ^ „wcsncpy - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ A b „strcat - cppreference.com“. En.cppreference.com. 8. října 2013. Citováno 6. března 2014.
- ^ „wcscat - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „strncat - cppreference.com“. En.cppreference.com. 1. července 2013. Citováno 6. března 2014.
- ^ „wcsncat - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „strxfrm - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „wcsxfrm - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „strlen - cppreference.com“. En.cppreference.com. 27. prosince 2013. Citováno 6. března 2014.
- ^ „wcslen - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „strcmp - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „wcscmp - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „strncmp - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „wcsncmp - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „strcoll - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „wcscoll - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „strchr - cppreference.com“. En.cppreference.com. 23. února 2014. Citováno 6. března 2014.
- ^ „wcschr - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „strrchr - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „wcsrchr - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „strspn - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „wcsspn - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „strcspn - cppreference.com“. En.cppreference.com. 31. května 2013. Citováno 6. března 2014.
- ^ „wcscspn - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „strpbrk - cppreference.com“. En.cppreference.com. 31. května 2013. Citováno 6. března 2014.
- ^ „wcspbrk - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „strstr - cppreference.com“. En.cppreference.com. 16. října 2013. Citováno 6. března 2014.
- ^ „wcsstr - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „strtok - cppreference.com“. En.cppreference.com. 3. září 2013. Citováno 6. března 2014.
- ^ „wcstok - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „strerror - cppreference.com“. En.cppreference.com. 31. května 2013. Citováno 6. března 2014.
- ^ „memset - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „wmemset - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ A b „memcpy - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „wmemcpy - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ A b „memmove - cppreference.com“. En.cppreference.com. 25. ledna 2014. Citováno 6. března 2014.
- ^ „wmemmove - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „memcmp - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „wmemcmp - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „memchr - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „wmemchr - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „mblen - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „mbtowc - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „wctomb - cppreference.com“. En.cppreference.com. 4. února 2014. Citováno 6. března 2014.
- ^ „mbstowcs - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „wcstombs - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „btowc - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „wctob - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „mbsinit - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „mbrlen - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „mbrtowc - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „wcrtomb - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „mbsrtowcs - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „wcsrtombs - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „6.3.2 Představující stav převodu“. Knihovna GNU C.. Citováno 31. ledna 2017.
- ^ „root / src / multibyte / c16rtomb.c“. Citováno 31. ledna 2017.
- ^ „Obsah /stable/11/lib/libc/locale/c16rtomb.c“. Citováno 31. ledna 2017.
- ^ „atof - cppreference.com“. En.cppreference.com. 31. května 2013. Citováno 6. března 2014.
- ^ „atoi, atol, atol - cppreference.com“. En.cppreference.com. 18. ledna 2014. Citováno 6. března 2014.
- ^ „strtof, strtod, strtold - cppreference.com“. En.cppreference.com. 4. února 2014. Citováno 6. března 2014.
- ^ „strtof, strtod, strtold - cppreference.com“. En.cppreference.com. 4. února 2014. Citováno 6. března 2014.
- ^ „strtof, strtod, strtold - cppreference.com“. En.cppreference.com. 4. února 2014. Citováno 6. března 2014.
- ^ „wcstof, wcstod, wcstold - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „wcstof, wcstod, wcstold - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „wcstof, wcstod, wcstold - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „strtol, strtoll - cppreference.com“. En.cppreference.com. 4. února 2014. Citováno 6. března 2014.
- ^ „wcstol, wcstoll - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ „strtoul, strtoull - cppreference.com“. En.cppreference.com. 4. února 2014. Citováno 6. března 2014.
- ^ „wcstoul, wcstoull - cppreference.com“. En.cppreference.com. Citováno 6. března 2014.
- ^ Odůvodnění C99, 7.20.1.1
- ^ "bzero". Otevřená skupina. Citováno 27. listopadu 2017.
- ^ „bzero (3)“. OpenBSD. Citováno 27. listopadu 2017.
- ^ "memccpy". Pubs.opengroup.org. Citováno 6. března 2014.
- ^ "mempcpy (3) - Linuxová manuální stránka". Kernel.org. Citováno 6. března 2014.
- ^ "strcasecmp (3) - Linuxová manuální stránka". Kernel.org. Citováno 6. března 2014.
- ^ A b „strcat_s, wcscat_s, _mbscat_s“. Msdn.microsoft.com. Citováno 6. března 2014.
- ^ "strdup". Pubs.opengroup.org. Citováno 6. března 2014.
- ^ "strerror (3) - Linuxová manuální stránka". man7.org. Citováno 3. listopadu 2019.
- ^ "Řetězec | stricmp ()". C Programování Expert.com. Citováno 6. března 2014.
- ^ A b "strlcpy, strlcat - kopírování a zřetězení řetězce ohraničené velikostí". OpenBSD. Citováno 26. května 2016.
- ^ A b C d Todd C. Miller; Theo de Raadt (1999). "strlcpy a strlcat - konzistentní, bezpečné, kopírování řetězce a zřetězení". USENIX '99.
- ^ "strsignal". Pubs.opengroup.org. Citováno 6. března 2014.
- ^ "strtok". Pubs.opengroup.org. Citováno 6. března 2014.
- ^ Miller, Damien (říjen 2005). „Zabezpečená přenositelnost“ (PDF). Citováno 26. června 2016.
Toto [strlcpy a strlcat] API bylo přijato většinou moderních operačních systémů a mnoha samostatnými softwarovými balíčky [...]. Pozoruhodnou výjimkou je standardní knihovna GNU C, glibc, jejíž správce vytrvale odmítá zahrnout tyto vylepšené API a označit je za „strašně neefektivní BSD kecy“, a to navzdory předchozím důkazům, že jsou rychlejší, než většina API, které nahrazují.
- ^ seznam adresátů libc-alpha, vybrané zprávy od 8. srpna 2000 vlákno: 53, 60, 61
- ^ Vzestupy a pády strlcpy (); LWN.net
- ^ "Přidávání strlcpy () do glibc". lwn.net.
Správné zacházení s řetězci znamená, že vždy víte, jak dlouhé jsou vaše řetězce, a proto můžete memcpy (místo strcpy).
- ^ Linux Funkce knihovny Manuál „Je však možné zpochybnit platnost takových optimalizací, protože narušují celý účel strlcpy () a strlcat (). Ve skutečnosti to první verze této příruční stránky pokazila.“ –
- ^ „root / src / string / strlcpy.c“. Citováno 28. ledna 2017.
- ^ „root / src / string / strlcat.c“. Citováno 28. ledna 2017.
- ^ Todd C. Miller. "strlcpy.c". Křížový odkaz BSD.
- ^ Todd C. Miller. "strlcat.c". Křížový odkaz BSD.
- ^ Lovell, Martyn. „Odrazte útoky na váš kód pomocí knihoven Visual Studio 2005 Safe C a C ++“. Citováno 13. února 2015.
- ^ „Standardní návrh C11“ (PDF). §K.3.1.4p2. Citováno 13. února 2013.CS1 maint: umístění (odkaz)
- ^ „Standardní návrh C11“ (PDF). §K.3.6.1.1p4. Citováno 13. února 2013.CS1 maint: umístění (odkaz)
- ^ „Ověření parametru“.
- ^ „Standardní návrh C11“ (PDF). §K.3.7.2.1p4. Citováno 13. února 2013.CS1 maint: umístění (odkaz)
- ^ Danny Kalev. „Už jsou na tom znovu“. InformIT. Archivovány od originál dne 15. ledna 2012. Citováno 10. listopadu 2011.
- ^ Bezpečná knihovna C. „Knihovna Safe C poskytuje vázanou kontrolní paměť a funkce řetězce podle normy ISO / IEC TR24731“. Sourceforge. Citováno 6. března 2013.
- ^ „Terénní zkušenosti s přílohou K - rozhraní pro kontrolu hranic“. Citováno 5. listopadu 2015.
- ^ "MSC06-C. Pozor na optimalizaci kompilátoru". Standard kódování SEI CERT C..
- ^ FreeBSD Funkce knihovny Manuál –
externí odkazy
- Rychlá poznámka v C, několik příkladů kódování C pro cílení na různé typy architektur instrukcí CPU