Traductions de cette page?:

strncpy

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.