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 :

fonctions strlcat strlcpy


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 6
    Points : 0
    Points
    0
    Par défaut fonctions strlcat strlcpy
    Bonjour, Bonsoir,
    Je reproduit strlcat et strlcpy et j'aimerais savoir qu'elle sont mes erreurs sur c'est deux fonctions

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     unsigned int    my_strlcat(char *dest, char *src, unsigned int size)
    {
        int i = 0;
        int i2 = 0;
        while(dest[i] != '\0')
            i++;
        while((src[i2] && size - i + 1 > i2)
        {
            dest[i++] = src[i2];
            i2++;
        }
        dest[i] = '\0';
        return (i);
    }
     
    unsigned int    my_strlcpy(char *dest, char *src, unsigned int size)
    {
        int i = 0;
        while(src[i] != '\0' && size > i+1 )
        {
            dest[i] = src[i];
            i++;
        }
        if (src[i] == '\0')
            return(i-1);
        else
        {
            while(size > i)
            {
                dest[i] = '\0';
                i++;
            }
            return (i -1);
        }
    }
    Je n'ai pas reelement compris ce que la fonction devait retourner et les man en generale mais comparer a strncat et strncpy ce sont les seuls interpretation que j'ai pu faire, merci d'avance.

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    première erreur, les pointeurs vers la source doivent être poineur vers constant.
    les noms de variables sont mauvais.
    J'aimerai bien voir src_size et dest_size plutot que i et i2


    Essaie ce genre de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    unsigned int my_strlcat(char *dest, char const *src, unsigned int buffer_size)
    {
    	unsigned int dest_base_size = strlen(dest);
    	unsigned int i = 0;
    	unsigned int const i_max = (buffer_size-1) - dest_base_size;
    	while (src[i]!='\0' && i < i_max) {
    		dest[dest_base_size+i] = src[++i];
    	}
    	dest[dest_base_size+i] = '\0';
    	return dest_base_size+i;
    }
    Je ne corrige pas la seconde fonction, je te la laisse pour l'exercice.

    D'après les mans, ces fonctions doivent retourner la taille de la chaine créée (ce que retournerait strlen(dest) après appel de la fonction)
    en l'occurence, l'index du '\0' final
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 6
    Points : 0
    Points
    0
    Par défaut
    Merci pour la reponse :
    Mauvais nom de variable et type a par ca une petite erreur que je n'avais pas vérifier.
    Par contre attention
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		dest[dest_base_size+i] = src[++i];
    enlève le premier caractère a concaténer mais j'ai régler le problème en reprenant mon ancien code a par ca c'est juste encore merci.
    Ps : grâce a ça je vais pouvoir aussi compléter strlcpy .
    Résolu

  4. #4
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    Citation Envoyé par leternel Voir le message
    D'après les mans, ces fonctions doivent retourner la taille de la chaine créée (ce que retournerait strlen(dest) après appel de la fonction)
    en l'occurence, l'index du '\0' final
    C'est bizarre, je n'interprète pas le man de la même façon que toi. Voici ce que j'ai trouvé ici, sur la page man de OpenBSD :
    Like snprintf(3), the strlcpy() and strlcat() functions return the total length of the string they tried to create. For strlcat() that means the initial length of dst plus the length of src.
    Traduction libre en français :
    Comme snprintf(), strlcpy et strlcat() retournent la longueur totale de la chaîne qu'elles ont ESSAYE de créer. Pour strlcat(), ceci signifie la taille initiale de dst plus la longueur de src.
    Donc pas nécessairement le nombre de caractères effectivement écrits.

  5. #5
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Citation Envoyé par phi1981 Voir le message
    Donc pas nécessairement le nombre de caractères effectivement écrits.
    C'est bien ce que retournent strlcat et strlcpy : cela permet de détecter plus facilement les chaines tronquées -- du moins c'est ce qu'explique le man :-)
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Fonction API
    Par margilb dans le forum C++Builder
    Réponses: 2
    Dernier message: 08/07/2002, 11h11
  3. Implémentation des fonctions mathématiques
    Par mat.M dans le forum Mathématiques
    Réponses: 9
    Dernier message: 17/06/2002, 16h19
  4. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24
  5. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

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