Strlcpy

strlcpy și strlcat  sunt funcții non-standard create ca un înlocuitor pentru omologii adesea utilizate greșit ale bibliotecii standard a limbajului de programare C pentru copierea conținutului unui șir terminat cu nul într-un buffer de dimensiune limitată cu protecție la supraîncărcare a bufferului .

strlcpy și strlcatsunt un înlocuitor sigur și eficient pentru funcțiile standard strncpyși strncat, respectiv.

strlcpyși strlcatau apărut și sunt menținute în OpenBSD . Mai târziu, au început să fie utilizate în alte sisteme de operare. Pe sistemele care nu suportă strlcpy/ strlcat, este posibil să le implementezi într-o manieră artizanală, cum ar fi din codul sursă distribuit sub licența BSD .

Descriere

Prototipuri descrise în fișierul antet string.h:

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

Funcția nu strlcpycopiază mai mult de caractere din șir srcîn buffer și este garantată să seteze caracterul nul la sfârșitul șirului. procedează la fel, însă, copierea nu se efectuează la început , ci în așa fel încât să continue linia indicată de . În cazul în care indică caracterul nul , comportamentul funcțiilor este echivalent. dstsize - 1strlcatdstdstdst

Valoarea returnată

strlcpyreturnează dimensiunea șirului la src. strlcatreturnează lungimea totală a șirurilor la adrese srcși dst. Valoarea returnată nu depinde de dacă întregul șir a fost copiat cu succes sau nu; acest lucru facilitează determinarea dacă buffer-ul de destinație este prea mic pentru șirul care este copiat.

Exemplu de utilizare

#include <șir.h> #include <stdio.h> /* pentru printf() */ charbuf [ 10 ] ; // buffer mai mic decât șirul int main ( void ) { const char * str = "model de șir" ; size_t sz ; buf [ 9 ] = '\0' ; // inițializare redundantă pentru imprimarea de depanare printf ( "șir: \" %s \"\n\n " , str ); printf ( "buffer înainte de copiere: \" %s \"\n " , buf ); sz = strlcpy ( buf , str , sizeof ( buf )); if ( sz >= sizeof ( buf )) printf ( " trunchiere detectată de la %zu la %lu caractere ! \n " , sz , sizeof ( buf ) -1 ); printf ( "buffer după copiere: \" %s \"\n " , buf ); returnează 0 ; }

Concluzie:

șir: „model șir” tampon înainte de copiere: "" trunchierea șirurilor a fost detectată de la 14 la 9 caractere! tampon după copiere: „probă cu”

(șirul a fost trunchiat la dimensiunea bufferului în timpul copierii - 9 caractere + zero)

Link -uri