strncpy är en C - programmeringsspråksstandardbiblioteksfunktion för att kopiera innehållet i en nollterminerad sträng till en buffert av begränsad storlek.
Funktionen strncpyliknar strcpybuffertspillskydd , men den är inte helt säker.
Funktionen stöds av alla C -kompilatorer .
Prototypen som beskrivs i rubrikfilen string.h:
char *strncpy (char *dst, const char *src, size_t len);
Funktionen kopierar inte mer än tecken (inklusive nolltecknet) från strängen srctill bufferten utan att garantera att strängen slutar med ett nolltecken (om strängens längd är större än eller lika med ). Om längden på strängen är mindre än , trycker bufferten upp till nolltecken. dstlensrclensrclenlen
Funktionen returnerar ett värde dst.
Slutsats:
string: "strängmönster" buffert före kopia: "" buffert efter kopia: "prov med"(strängen trunkerades till buffertens storlek under kopiering - 9 tecken + noll)
Funktionen strncpyär utformad för att skydda program från buffertspill , men den är i sig också osäker till sin design - standardfunktionen garanterar inte att ett nolltecken ställs in i slutet av bufferten, vilket, när man försöker skriva ut en rad från bufferten (eller arbeta med det), kan leda till att data läses utanför bufferten , vilket kommer att få programmet att krascha, vilket kan användas för att utföra en nätverksattack .
När du arbetar med funktionen korrekt måste du skicka ett värde lenett mindre än buffertstorleken till funktionen, och även ställa in den sista byten till 0 själv:
charbuf[BUFSIZE]; strncpy(buf, input, sizeof(buf) - 1); buf[sizeof(buf) - 1] = '\0';OpenBSD-utvecklarna strncpyhar gjort en icke-standardfunktion för att ersätta den med en strlcpynoll-terminerad sträng. På system som också implementerar det, rekommenderas det att använda det istället för strncpy. På andra system är det möjligt att göra en hemmagjord implementering av denna funktion, från källkod distribuerad under BSD-licensen .
Löser strlcpydessutom prestandaproblemet strncpy(se nedan).
Standardbeteendet strncpyär inte optimalt - funktionen fyller hela resten av [1] [2] bufferten med nollor varje gång , vilket leder till overheadförbrukning av processorresursen när bufferten är stor och när man arbetar med korta strängar (en vanlig situation i nätverksservrar).
Att använda istället för en strncpyicke-standardfunktion eller en hantverksfunktion (som till exempel Apachestrlcpy skrevs om vid ett tillfälle [1] ), kan ge en betydande prestandaökning (en femfaldig ökning visades på ett syntetiskt test [2] ).