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 :

Utilisation de strlcat


Sujet :

C

  1. #1
    Membre régulier Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Points : 119
    Points
    119
    Par défaut Utilisation de strlcat
    Bonjour à tous,

    Voudriez-vous me dire comment appeler strlcat?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char * x = "Hello, w.";
    char  x1 [16]= "Hello, world.";
    strlcat (x1, x+2, 2);
     
    printf("%s\n", x1);




    JPD
    Petit Malin
    "accélérateur . . . qui pousse . . . un électron a passer par deux trous d’un écran en même temps." (Cyrille Burt: "C’est mieux qu’un fantôme") (Janus p.251)
    "Joy is to love what is, pain is to love what is not"
    )

    HP Pavilion Elite Desktop PC 570-p0xx - Window10 64 bits - Intel(R) Core(TM)2 Quad CPU Q8200 @ 3GHz x86_64-w64-mingw32-gcc-7.3.0.exe

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Je ne suis pas sûr de comprendre ce que tu veux faire.

    L'aide de strlcat est ici (entre autre)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre régulier Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Points : 119
    Points
    119
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char * x = "Hello, word.";
    char  x1 [14]= "Hello, world.";
    int i = strlcat (x1, x+7,  19);
     
    printf("%d  -%s-\n", i, x1);
    [CODE]
    18 -Hello, world.word.-
    CODE]



    Ça s'appelle comme ça?


    JPD
    Petit Malin
    "accélérateur . . . qui pousse . . . un électron a passer par deux trous d’un écran en même temps." (Cyrille Burt: "C’est mieux qu’un fantôme") (Janus p.251)
    "Joy is to love what is, pain is to love what is not"
    )

    HP Pavilion Elite Desktop PC 570-p0xx - Window10 64 bits - Intel(R) Core(TM)2 Quad CPU Q8200 @ 3GHz x86_64-w64-mingw32-gcc-7.3.0.exe

  4. #4
    Membre régulier Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Points : 119
    Points
    119
    Par défaut
    J'essaie de comprendre strlcat.

    J'ai un problème de malloc avec le Ä en trop au début

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int main(void)
    {
    char x []= "Hello, world.";
    char *r =  malloc(30 * sizeof(x));
     
    strlcat (r, x, 9);
     
    strlcat (r , x+7, 15);
    for(; *r != '\0'; r++)
    printf("%c-", *r);
    printf("\n");  
     
    return 0;
    }
    J'obtiens:

    Ä-H-e-l-l-o-,- -w-o-r-l-d-.-
    Petit Malin
    "accélérateur . . . qui pousse . . . un électron a passer par deux trous d’un écran en même temps." (Cyrille Burt: "C’est mieux qu’un fantôme") (Janus p.251)
    "Joy is to love what is, pain is to love what is not"
    )

    HP Pavilion Elite Desktop PC 570-p0xx - Window10 64 bits - Intel(R) Core(TM)2 Quad CPU Q8200 @ 3GHz x86_64-w64-mingw32-gcc-7.3.0.exe

  5. #5
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char *r =  malloc(30 * sizeof(x));
     
    strlcat (r, x, 9);
    r et x doivent être des chaînes de caractères C, c'est à dire terminées par un '\0'
    C'est le cas de x.
    Pour r, le buffer contient n'importe quoi mais la fonction va chercher un '\0' dedans et finir par en trouver un (ou ça va planter). Elle ajoutera les caractères derriere ce qui donnera un début de chaîne erronné.
    C'est la même chose pour strcat.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char *r =  malloc(30 * sizeof(x));
     *r = '\0';
    strlcat (r, x, 9);
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    De plus, c'est pas bon du tout de modifier la valeur d'un pointeur qui stocke l'adresse renvoyée par malloc. Car cette valeur doit, plus tard, être utilisée pour libérer la mémoire allouée, en utilisant free.

    EDIT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char x []= "Hello, world.";
    char *r =  malloc(30 * sizeof(x));
    sizeof(x) correspond à la taille du tableau et non pas d'un seul char.
    Il faut remplacer la ligne par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *r =  malloc(30 * sizeof(*r));

  7. #7
    Membre régulier Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Points : 119
    Points
    119
    Par défaut
    Citation Envoyé par jeroman Voir le message
    De plus, c'est pas bon du tout de modifier la valeur d'un pointeur qui stocke l'adresse renvoyée par malloc. Car cette valeur doit, plus tard, être utilisée pour libérer la mémoire allouée, en utilisant free.
    Ma boucle ne modifie pas r, elle teste pour savoir si le bout de la chaîne est atteint.

    Non?

    JPD
    Petit Malin
    "accélérateur . . . qui pousse . . . un électron a passer par deux trous d’un écran en même temps." (Cyrille Burt: "C’est mieux qu’un fantôme") (Janus p.251)
    "Joy is to love what is, pain is to love what is not"
    )

    HP Pavilion Elite Desktop PC 570-p0xx - Window10 64 bits - Intel(R) Core(TM)2 Quad CPU Q8200 @ 3GHz x86_64-w64-mingw32-gcc-7.3.0.exe

  8. #8
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par J4e8a16n Voir le message
    Ma boucle ne modifie pas r, elle teste pour savoir si le bout de la chaîne est atteint.
    Si, la boucle modifie bien r, mais pas ce qui est dedans (ouf)

    Contournement : Ne pas travailler sur r mais sur une copie :
    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
    int main(void)
    {
        char x []= "Hello, world.";
        char *r =  malloc(30 * sizeof *r );
        char *p;
        *r = '\0';
        strlcat (r, x, 9);
        strlcat (r , x+7, 15);
     
        p = r;
        for(; *p != '\0'; p++)
            printf("%c-", *p);
        printf("\n");  
     
        free(r);
        return 0;
    }

  9. #9
    Membre régulier Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Points : 119
    Points
    119
    Par défaut
    Citation Envoyé par mabu Voir le message
    Si, la boucle modifie bien r, mais pas ce qui est dedans (ouf)
    Alors là, c'est grand merci.

    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
     
    int main(void)
    {
        char x []= "Hello, world.";
        char *r =  malloc(30 * sizeof *r );
        char *p;
        *r = '\0';
        strlcat (r, x, 9); printf("%d-",strlen( r));
        strlcat (r , x+8, 15); printf("%d-\n",strlen( r));
     
        strlcat (r, x, 6); printf("%d-\n", strlen( r));
     
        p = r;
     
     
        for(; *p != '\0'; p++)
            printf("%c-", *p);
     
        printf("\n");  
        free(r);
        return 0;
    }
    /*
    8-13-
    13-
    H-e-l-l-o-,- -w-o-r-l-d-.-
    */
    Pourquoi je n'ai pas H-e-l-l-o-,- -w-o-r-l-d-.-H-e-l-l-o-,- ?

    Je sens qu'on va me répondre quelque chose du genre:

    Si, la boucle modifie bien p, mais pas ce qui est dedans. (ouf)

    Pour vous, c'est plus facile d'apprendre C?


    JPD
    Petit Malin
    "accélérateur . . . qui pousse . . . un électron a passer par deux trous d’un écran en même temps." (Cyrille Burt: "C’est mieux qu’un fantôme") (Janus p.251)
    "Joy is to love what is, pain is to love what is not"
    )

    HP Pavilion Elite Desktop PC 570-p0xx - Window10 64 bits - Intel(R) Core(TM)2 Quad CPU Q8200 @ 3GHz x86_64-w64-mingw32-gcc-7.3.0.exe

  10. #10
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par J4e8a16n Voir le message
    Alors là, c'est grand merci.
    Fait le test : le pointeur r est modifié, la chaine pointée par r ne l'est pas.
    Le code suivant crashe, pourtant, la boucle ne modifie pas la chaine de caractères :
    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
    int main(void)
    {
        char *r = malloc(30);
     
        strcpy(r, "Hello");
     
        printf("r: %p\n", r); 
     
        for(; *r != '\0'; ++r) {
            printf("%c-", *r);
        }
        printf("\n");
        printf("r: %p\n", r);
     
        free(r);
        return 0;
    }
    Sinon, le dernier paramètre de strlcat n'est pas la taille de se qu'on veut copier, mais la taille du buffer de destination.

    Citation Envoyé par http://www.manpagez.com/man/3/strlcat/
    The strlcat() function appends the NUL-terminated string src to the end of dst. It will append at most size - strlen(dst) - 1 bytes, NUL-terminating the result.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    /* strlen(r) vaut 0, size 9 --> copie au max 8 caractères */
    strlcat (r, x, 9);
    /* strlen(r) vaut 8, size 15 --> copie au max 6 caractères */
    strlcat (r , x+8, 15);
    /* strlen(r) vaut 13, size 6 --> copie 0 caractère */
    strlcat (r, x, 6);
    Pour obtenir le résultat attendu, utilise plutôt strncat.

  11. #11
    Membre régulier Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Points : 119
    Points
    119
    Par défaut
    Fait le test : le pointeur r est modifié, la chaine pointée par r ne l'est pas.
    Le code suivant crashe, pourtant, la boucle ne modifie pas la chaine de caractères :
    Ici ça ne crash pas.

    "C:\MinGW\bin\gcc.exe" -W -Wall -mconsole -Wno-missing-braces -o tstptr tstPtr.c

    >tstptr
    r: 002C1790
    H-e-l-l-o-
    r: 002C1795
    Petit Malin
    "accélérateur . . . qui pousse . . . un électron a passer par deux trous d’un écran en même temps." (Cyrille Burt: "C’est mieux qu’un fantôme") (Janus p.251)
    "Joy is to love what is, pain is to love what is not"
    )

    HP Pavilion Elite Desktop PC 570-p0xx - Window10 64 bits - Intel(R) Core(TM)2 Quad CPU Q8200 @ 3GHz x86_64-w64-mingw32-gcc-7.3.0.exe

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

Discussions similaires

  1. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  2. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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