Strlcpy

strlcpy a strlcat  jsou nestandardní funkce vytvořené jako náhrada za často zneužívané protějšky standardní knihovny programovacího jazyka C pro kopírování obsahu řetězce ukončeného nulou do vyrovnávací paměti omezené velikosti s ochranou proti přetečení vyrovnávací paměti .

strlcpy a strlcatjsou bezpečnou a efektivní náhradou za standardní funkce strncpya strncat, resp.

strlcpya strlcatobjevily se a jsou udržovány v OpenBSD . Později se začaly používat v některých dalších operačních systémech. Na systémech, které nepodporují strlcpy/ strlcat, je možné je implementovat řemeslným způsobem, například ze zdrojového kódu distribuovaného pod licencí BSD .

Popis

Prototypy popsané v záhlaví souboru string.h:

size_t strlcpy (char *dst, const char *src, size_t size); size_t strlcat (char *dst, const char *src, size_t size);

Funkce strlcpyzkopíruje z řetězce srcdo vyrovnávací paměti dstmaximálně znaků size - 1a je zaručeno, že na konec řetězce nastaví znak null. strlcatdělá totéž, kopírování se však neprovádí na začátku dst, ale tak, aby pokračovalo v řádku, na který ukazuje dst. V případě, že dstukazuje na znak null , je chování funkcí ekvivalentní.

Návratová hodnota

strlcpyvrátí velikost řetězce na src. strlcatvrátí celkovou délku řetězců na adresách srca dst. Vrácená hodnota nezávisí na tom, zda byl celý řetězec úspěšně zkopírován nebo ne; to usnadňuje určení, zda je cílová vyrovnávací paměť pro kopírovaný řetězec příliš malá.

Příklad použití

#include <řetězec.h> #include <stdio.h> /* pro printf() */ charbuf [ 10 ] ; // buffer menší než řetězec int main ( void ) { const char * str = "vzor řetězce" ; velikost_t sz ; buf [ 9 ] = '\0' ; // redundantní inicializace pro tisk ladění printf ( "řetězec: \" %s \"\n\n " , str ); printf ( "vyrovnávací paměť před kopírováním: \" %s \"\n " , buf ); sz = strlcpy ( buf , str , sizeof ( buf )); if ( sz >= sizeof ( buf )) printf ( "detekováno zkrácení z %zu na %lu znaků ! \n " , sz , sizeof ( buf ) -1 ); printf ( "vyrovnávací paměť po kopírování: \" %s \"\n " , buf ); návrat 0 ; }

Závěr:

řetězec: "vzor řetězce" vyrovnávací paměť před kopírováním: "" zjištěno zkrácení řetězce ze 14 na 9 znaků! vyrovnávací paměť po kopii: "sample with"

(řetězec byl při kopírování zkrácen na velikost vyrovnávací paměti - 9 znaků + nula)

Odkazy