IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèque standard C Discussion :

Utilité de strncpy


Sujet :

Bibliothèque standard C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 100
    Par défaut Utilité de strncpy
    Bonjour

    je ne vois spas l'utilite de strncpy
    puisque a chaque fois que j el'utilise j'ai besoin de mettre le dernier caracter a '\0'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char buffer [10];
     
    strncpy(buffer, "bonjour Les Amis", 10);
    buffer[9] = '\0';
    je pense que c'est equivalent a

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char buffer [10];
     
    memcpy(buffer, "bonjour Les Amis", 10);
    buffer[9] = '\0';
    et enplus rapide
    car je pense que strncpy fait copie caractere par caractere tout en testant a chaque fois si le caracter = '\0'


    Tout commentaire est le bienvenu

  2. #2
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    tu peux aussi faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char buffer[10] = {0};
    strncat (buffer, "chaine", 9);
    Mais de toute façon, on a trop vite fait de faire des erreurs avec ces fonctions, l'idéal est d'avoir un système ou une bibliothèque qui implémente strlcpy/strlcat et là le comportement est sûr.

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 677
    Par défaut la doc dit...
    The strncpy() function copies at most n characters from s2 into s1. If
    s2 is less than n characters long, the remainder of s1 is filled with
    `\0' characters. Otherwise, s1 is not terminated.

    => Ca termine 'bien' la chaine de destination lorsque 'n' est >strlen(s2).
    Et quelque part c'est bien ce qu'on veut non?
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    The strncpy() function copies at most n characters from s2 into s1. If
    s2 is less than n characters long, the remainder of s1 is filled with
    `\0' characters. Otherwise, s1 is not terminated.

    => Ca termine 'bien' la chaine de destination lorsque 'n' est >strlen(s2).
    Et quelque part c'est bien ce qu'on veut non?
    - W
    http://www.developpez.net/forums/sho...32#post3383032

  5. #5
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    => Ca termine 'bien' la chaine de destination lorsque 'n' est >strlen(s2).
    Et quelque part c'est bien ce qu'on veut non?
    - W
    Généralement ce que l'on veut avec des fonctions de manipulation de chaînes c'est obtenir une chaîne valide au final. Ce qui n'est pas le cas avec strncpy() si la chaîne d'origine est plus longue que n (il n'y a pas la \0 terminal dans ce cas).

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 677
    Par défaut
    Citation Envoyé par gl Voir le message
    Généralement ce que l'on veut avec des fonctions de manipulation de chaînes c'est obtenir une chaîne valide au final. Ce qui n'est pas le cas avec strncpy() si la chaîne d'origine est plus longue que n (il n'y a pas la \0 terminal dans ce cas).
    Certes mais lorsqu'on demande de recopier une chaine de caractères dans un buffer plus petit, tronquer est une option et il faut bien que le codeur précise d'une façon ou d'une autre ce qu'il veut.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Les chaînes de caractères en C sont terminées par un NUL byte, la fonction strncpy dans certain cas comme ceux exposés juste avant, ne rend pas une chaîne valide (i.e terminé par un NUL byte), il y a donc bien un bug.

  8. #8
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Certes mais lorsqu'on demande de recopier une chaine de caractères dans un buffer plus petit, tronquer est une option
    C'est plus qu'une option. Dans ce cas de figure il faudra forcement tronquer la chaîne.

    Citation Envoyé par wiztricks Voir le message
    et il faut bien que le codeur précise d'une façon ou d'une autre ce qu'il veut.
    Justement, s'il utilise une fonction str...() c'est bien dans le but d'obtenir une chaîne valide et donc terminée par un \0 terminal.

    Si le but recherche est simplement de copier des octets d'un tableau dans un autre, sans se préoccuper de la notion de chaîne de caractère, strncpy() n'est pas un bon choix, memcpy() ou memmove() sont prévus pour de telles opérations.

    En outre, ce qui est clairement problématique, c'est d'avoir des comportements différents selon la fonction utilisée (strncpy() n'ajoute pas toujours le \0 terminal, strncat() ou snprintf() si).

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Mokhtar BEN MESSAOUD Voir le message
    je ne vois spas l'utilite de strncpy
    Moi non plus. J'utilise strncat().

Discussions similaires

  1. Utilité d'un pointeur vers une fonction ?
    Par Nasky dans le forum C
    Réponses: 10
    Dernier message: 20/03/2010, 19h54
  2. [J2EE] Utilité de la J2EE de SUN ?
    Par PeteMitchell dans le forum Java EE
    Réponses: 4
    Dernier message: 14/05/2004, 10h29
  3. [LG]Utilité du type enuméré ?
    Par tarbala dans le forum Langage
    Réponses: 2
    Dernier message: 10/12/2003, 16h20
  4. Le BIOS et son utilité
    Par le mage tophinus dans le forum Assembleur
    Réponses: 75
    Dernier message: 21/11/2003, 15h37
  5. utilité du binaire et hexadecimaux?
    Par souris78 dans le forum C
    Réponses: 9
    Dernier message: 01/07/2003, 15h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo