strlcpy

, par MiKaël Navarro

La fonction strcpy est utilisée pour copier une chaîne de caractères depuis une source src (y compris le caractère nul \0) vers une destination dest :

char *strcpy( char *dest, const char *src )

Mais attention, les deux buffers dest et src ne doivent pas se chevaucher et le buffer dest doit être assez grand pour accueillir la copie. Attention donc au dépassement de tampon !

Une alternative est d’utiliser strncpy qui copie au plus n caractères de src :

char *strncpy(char *dest, const char *src, size_t n);

S’il permet de se prémunir du dépassement de tampon (si l’on admet que l’on calcul correctement la taille n), strncpy ne garanti pas que la chaîne copiée se termine par le caractère \0 (ce qui peut causer un segfault à strlen par exemple) !

Une façon plus sûr serait d’utiliser strncat qui s’assure que la chaîne dest est NULL terminée :

char dest[dest_size];
if (dest_size > 0)
{
   dest[0] = '\0';
   strncat(dest, source, dest_size - 1);
}

Ou encore snprintf permet de copier au plus n caractères \0 final compris :

int snprintf(char *str, size_t size, const char *format, ...);

Mais il y a encore une autre solution avec la fonction strlcpy qui tronquera le résultat en fonction de la destination (et terminera la chaîne avec un \0).
Cependant strlcpy n’existe pas dans glibc et n’est pas normalisé par POSIX, mais est disponible sous Linux avec la bibliothèque libbsd.

Une implémentation simple pourrait être :

size_t strlcpy(char *dst, const char *src, size_t dsize)
{
 size_t len = strlen(src);
 if (dsize) {
   size_t bl = (len < dsize-1 ? len : dsize-1);
   ((char*)memcpy(dst, src, bl))[bl] = 0;
 }
 return len;
}

P.-S.

Ou alors utilisez directement memcpy ;)