Strlcpy

strlcpy och strlcat  är icke-standardiserade funktioner skapade som en ersättning för de ofta missbrukade motsvarigheterna till C - programspråkets standardbibliotek för att kopiera innehållet i en nollterminerad sträng till en buffert av begränsad storlek med buffertspillskydd .

strlcpy och strlcatär en säker och effektiv ersättning för standardfunktionerna strncpyrespektive strncat.

strlcpyoch strlcatdök upp och underhålls i OpenBSD . Senare började de användas i några andra operativsystem. På system som inte stöder strlcpy/ strlcat, är det möjligt att implementera dem på ett hantverksmässigt sätt, till exempel från källkod distribuerad under BSD-licensen .

Beskrivning

Prototyper som beskrivs i rubrikfilen string.h:

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

Funktionen strlcpykopierar inte mer än tecken från strängen srctill bufferten och kommer garanterat att sätta nolltecknet till slutet av strängen. gör detsamma, men kopieringen utförs inte i början utan på ett sådant sätt att den linje som pekas på fortsätter . I fallet när det pekar på nolltecknet är funktionernas beteende likvärdigt. dstsize - 1strlcatdstdstdst

Returvärde

strlcpyreturnerar storleken på strängen vid src. strlcatreturnerar den totala längden på strängar vid adresser srcoch dst. Returvärdet beror inte på om hela strängen lyckades kopieras eller inte; detta gör det enkelt att avgöra om destinationsbufferten är för liten för strängen som kopieras.

Användningsexempel

#include <string.h> #include <stdio.h> /* för printf() */ charbuf [ 10 ] ; // buffert mindre än sträng int main ( void ) { const char * str = "strängmönster" ; storlek_t sz ; buf [ 9 ] = '\0' ; // redundant initiering för felsökningsutskrift printf ( "sträng: \" %s \"\n\n " , str ); printf ( "buffert före kopia: \" %s \"\n " , buf ); sz = strlcpy ( buf , str , sizeof ( buf )); if ( sz >= sizeof ( buf )) printf ( " trunkering upptäckt från %zu till %lu tecken ! \n " , sz , sizeof ( buf ) -1 ); printf ( "buffert efter kopia: \" %s \"\n " , buf ); returnera 0 ; }

Slutsats:

string: "strängmönster" buffert före kopia: "" sträng trunkering upptäckt från 14 till 9 tecken! buffert efter kopia: "prov med"

(strängen trunkerades till buffertens storlek under kopiering - 9 tecken + noll)

Länkar