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

 C Discussion :

Recoder la fonction strncpy


Sujet :

C

  1. #1
    Membre éclairé Avatar de labarre2002
    Homme Profil pro
    Inscrit en
    Avril 2008
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 236
    Par défaut Recoder la fonction strncpy
    Bonjour

    Je dois recoder la fonction strncpy

    avec ce prototype
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char  *ft_strncpy(char *dest,char *src,unsigned int n);
    le soucis est que j'ai beau lire le manuel j'ai du mal surtout avec la variable unsigned int n.

    pourrais-je avoir des explications, au mieux un algorithme ?

    Merci.

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 799
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par labarre2002 Voir le message
    le soucis est que j'ai beau lire le manuel j'ai du mal surtout avec la variable unsigned int n
    A moi ça me semble pourtant assez évident : elle sert à copier les n premiers caractères de src dans dest. Il faut donc bien qu'on le lui passe quelque part ce "n" pour qu'elle sache combien copier !!!???!!!

    Citation Envoyé par labarre2002 Voir le message
    pourrais-je avoir des explications, au mieux un algorithme ?
    Tu boucles sur i partant de 0 et allant jusqu'à n en copiant src[i] dans dest[i]. En faisant gaffe au cas où tu atteindrais la fin de src (le '\0') avant d'avoir fini la boucle.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre émérite
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Par défaut
    Citation Envoyé par labarre2002 Voir le message
    Bonjour

    [...]

    le soucis est que j'ai beau lire le manuel j'ai du mal surtout avec la variable unsigned int n.

    pourrais-je avoir des explications, au mieux un algorithme ?

    [...]
    Bonjour,
    alors :
    Citation Envoyé par ISO C11 manual
    7.23.2.4 The strncpy function

    Synopsis

    #include <string.h>
    char *strncpy(char * restrict s1, const char * restrict s2, size_t n);


    Description
    The strncpy function copies not more than n characters (characters that follow a null character are not copied) from the array pointed to by s2 to the array pointed to by s1.
    If copying takes place between objects that overlap, the behavior is undefined.
    If the array pointed to by s2 is a string that is shorter than n characters, null characters are appended to the copy in the array pointed to by s1, until n characters in all have been written.

    Returns
    he strncpy function returns the value of s1.

    ⇒ source ISO C 11 manual
    a priori la doc ISO est claire : la fonction copie n char d'un tableau source vers un tableau destination, et si jamais il y a moins de n char à copier de source on copie des NUL char à la place. Une fois que tu as fais ça tu renvoies l'adresse du premier char du tableau destination.

    Tu as carrément l'algo en français … je ne vois pas où tu pourrais bloquer.

  4. #4
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 753
    Par défaut
    J'ajouterai que si strlen(source) > n, alors le dernier caractère de destination ne sera pas un \0:

    No null-character is implicitly appended at the end of destination if source is longer than num. Thus, in this case, destination shall not be considered a null terminated C string (reading it as such would overflow).
    Source

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 799
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par edgarjacobs Voir le message
    J'ajouterai que si strlen(source) > n, alors le dernier caractère de destination ne sera pas un \0
    Pas besoin de s'en préoccuper, suffit de copier jusqu'à n en cherchant aussi le '\0'. Si on atteint le '\0' avant n alors il est copié dans dest, sinon il ne l'est pas.
    Ca m'a un peu choqué la première fois que je m'en suis rendu compte (j'étais persuadé que toutes les fonctions de création de string mettaient le '\0' quoi qu'il arrive) puis je m'y suis fait.

    Citation Envoyé par WhiteCrow Voir le message
    et si jamais il y a moins de n char à copier de source on copie des NUL char à la place.
    Ah zut, j'avais jamais fait gaffe !!! Je pensais que ça mettait un NUL (le minimum légal), je savais pas que ça remplissait le reste de NUL !!!
    Et franchement je ne pige pas la raison de ce travail inutile...

    En tout cas cela modifie l'algo que j'ai écrit dans mon post précédent...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 391
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ah zut, j'avais jamais fait gaffe !!! Je pensais que ça mettait un NUL (le minimum légal), je savais pas que ça remplissait le reste de NUL !!!
    Et franchement je ne pige pas la raison de ce travail inutile...
    En fait, pour moi ça explique pourquoi ça ne met pas systématiquement un NUL à la fin: La fonction semble avoir été pensée pour remplir des enregistrements.
    Genre tu as un fichier, répertoire, avec des champs nom et telephone de taille fixe, et tu veux pouvoir utiliser tous les caractères à disposition dans le champ...
    Pour remplir des tableaux de caractères dans une structure, ça a du sens de ne pas vouloir avoir de "garbage data" dans le buffer (et ça garantit que deux buffers contenant la même chaîne sont aussi considérés identiques par memcmp()).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 799
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    La fonction semble avoir été pensée pour remplir des enregistrements.
    Moui. Dans ce cas je ne l'aurais pas appelée "strtruc()" car ça s'accorde mal avec le comportement des autres "strmachin()" qui, elles, promettent quoi qu'il arrive une vraie string à l'arrivée

    Citation Envoyé par Médinoc Voir le message
    Genre tu as un fichier, répertoire, avec des champs nom et telephone de taille fixe, et tu veux pouvoir utiliser tous les caractères à disposition dans le champ... et ça garantit que deux buffers contenant la même chaîne sont aussi considérés identiques par memcmp().
    Joli exemple, surtout avec le memcmp() final
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Recoder la fonction exponentielle
    Par Twin111 dans le forum Mathématiques
    Réponses: 5
    Dernier message: 21/07/2019, 09h49
  2. Recoder la fonction malloc en C
    Par theyoks dans le forum Linux
    Réponses: 5
    Dernier message: 24/02/2011, 18h50
  3. La fonction Strncpy
    Par nawal.02 dans le forum Débuter
    Réponses: 18
    Dernier message: 26/08/2010, 00h54
  4. utilisation fonction strncpy
    Par john123 dans le forum C
    Réponses: 7
    Dernier message: 16/10/2007, 21h30
  5. recoder la fonction cat
    Par Pitou5464 dans le forum C
    Réponses: 13
    Dernier message: 17/10/2006, 20h22

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