Syntaxe :
#include <cstring> char *strncpy (char *vers, const char *depuis, size_t nb); namespace std { using ::strncpy; }
La fonction strncpy()
copie au plus nb
caractères de la chaîne
depuis
dans la chaîne vers
. Si depuis
fait moins que nb
caractères, alors le reste est remplit avec des caractère de fin de chaîne
(\0
).
La valeur de retour est un pointeur vers la chaîne résultante (vers
).
Attention : Si vous lisez attentivement la définition de strncpy()
,
vous réaliserez que cette fonction peut ne pas terminer la chaîne résultante par
le caractère de terminaison \0
! Ceci est inconnu de beaucoup de développeurs,
mais il y a une bonne raison à cela ; ce qui nous mène à un usage “standard”
de strncpy
comme ceci :
#include <cstring> #include <cstdlib> int main(int argc, char *argv[]) { if (argc!=2) { return EXIT_FAILURE; } char buff[6]; strncpy(buff, argv[1], sizeof(buff)); // Voici la partie dangereuse du code, // il ne faut pas oublier cette vérification // après une utilisation de strncpy: if (buff[sizeof(buff)-1] != '\0') { // Il y a un dépassement de tampon. // Vous pouvez soit renvoyer une erreur : return EXIT_FAILURE; // soit tronquer la chaîne résultante : buff[sizeof(buff)-1]='\0'; } // mais dans tout les cas, assurez-vous, // qu'à ce niveau, la chaîne // est terminée par un '\0' }
L'utilisation de strncpy()
seule ne produit pas du code “sûr”.
Cette fonction doit être utilisée correctement (voir ci-dessus), sinon,
un code qui part du principe qu'un tampon de 6 octets peut contenir au
maximum 5 caractères risque de ne pas marcher et cela pourrait provoquer
un crash du programme (ou pire).
Un solution alternative est d'utiliser strncat()
qui termine
toujours les chaîne par un \0
.
#include <cstring> #include <cstdlib> int main(int argc, char *argv[]) { if (argc!=2) { return EXIT_FAILURE; } char buff[6] = ""; strncat(buff, argv[1], sizeof(buff)-1); }
Sujets connexes : memcpy, strchr, strcpy, strncat, strncmp
Deux autres fonctions similaires (mais non-standards) existent, il s'agit de strlcpy et strlcat.