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 :

concaténation de char*


Sujet :

C

  1. #1
    Membre éprouvé Avatar de Jérémy Lefevre
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Luxembourg

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 898
    Points : 969
    Points
    969
    Par défaut concaténation de char*
    Bonjour à tous,
    voila j'ai besoin de concatené un certain nombre de char * j'ai vu strcat mais il y a quelque souci enfin si quelqu'un a de l'info la dessus je suis preneur
    jeremy

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Il n'y a aucun souci avec strcat, il suffit de savoir, comme toujours en C, ce que l'on fait : pour strcat il faut que le tableau de caractères recevant soit assez long pour pouvoir contenir l'ancienne chaîne plus la nouvelle chaîne concaténée.

  3. #3
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Salut,

    A quel style de soucis penses-tu concernant l'utilisation de strcat. Il faut juste faire attention à ce que la chaîne cible ait l'espace suffisant pour contenir les 2 chaînes concaténées et pour contenir le caractère '\0' en fin de chaîne.

    Un petit exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void)
    {
        char cible[20] = "Hello";
     
        strcat(cible, " world!");
        puts(cible); /* affiche "Hello world!"*/
     
        return EXIT_SUCCESS;
    }
    Le seul soucis et que le tableau de caractère cible doit contenir un minimum de 13 cases pour accueillir "Hello world!"

    Meilleures salutations

    Thierry

  4. #4
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    si tu as strncat... ça regle le probleme de taille de ton tableau ...

    sinon tu peux recoder strncat !

    Citation Envoyé par man strncat
    The strncat() function is similar (to strcat), except that it will use at most n
    characters from src. Since the result is always terminated with `\0',
    at most n+1 characters are written.

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Citation Envoyé par Dark_Ebola
    si tu as strncat... ça regle le probleme de taille de ton tableau ...

    sinon tu peux recoder strncat !

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par jerem2000
    Bonjour à tous,
    voila j'ai besoin de concatené un certain nombre de char * j'ai vu strcat mais il y a quelque souci enfin si quelqu'un a de l'info la dessus je suis preneur
    jeremy
    Quels sont tes soucis ? Si tu nous le dit pas on peut pas deviner ... enfin moi j'ai oublié de regarder au fond de ma tasse de thé

    Si c'est un problème de taille pour l'adresse cible, moi ce que je conseil, c'est d'allouer un espace pour la chaine cible de taille equivalente à toutes les chaînes à concaténer ensembles + 1 pour le zéro de fin.

    Si tu ne connais pas le nombre de chaînes en avance, vive realloc (au lieu de malloc) !


    Enfin voilà, dit nous en un peu plus et montre nous ton code !

  7. #7
    Membre éprouvé Avatar de Jérémy Lefevre
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Luxembourg

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 898
    Points : 969
    Points
    969
    Par défaut
    oui voila le problem la taille et complètement variable

  8. #8
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par jerem2000
    oui voila le problem la taille et complètement variable
    Bin montre ton code ... ca va pas se faire tout seul non plus.

  9. #9
    Membre éprouvé Avatar de Jérémy Lefevre
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Luxembourg

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 898
    Points : 969
    Points
    969
    Par défaut
    ok je te fait un exemple qui va reprendre juste ce dont j'ai besoin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main(int argc, char *argv[])
    {
          //initialisation des variables
          char * end, user, pass;
          char * dest="";
          //récupération des paramètres
          user=strtol(argv[1], &end, 0);
          pass=strtol(argv[2], &end, 0);
     
          //je concatène les chaines user, et pass
          strcat(dest,user);
          strcat(dest,pass);
    }
    voila et ca ca me pose problème! car ce sont des char*

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 589
    Points
    41 589
    Par défaut
    Il y a un problème, là: user et pass ne sont pas des chaînes, mais des char (un type entier, donc) qui reçoivent la valeur de retour de strtol() (de type long, un type entier également) qui ne sont pas directement concaténables à des chaînes...

    La seule fonction standard disponible partout pour cela, c'est sprintf(). Attention, il faut être sûr de donner un buffer assez grand. Généralement, considérer 20 caractères max pour un entier est une taille raisonnable...

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 136
    Points : 133
    Points
    133
    Par défaut
    salut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    long int strtol (const char *nptr, char **endptr, int base);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char *dest = ""; // euh... c'est quoi le but là ?

  12. #12
    Membre éprouvé Avatar de Jérémy Lefevre
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Luxembourg

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 898
    Points : 969
    Points
    969
    Par défaut
    ué c vrai j'ai fait nimp la
    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(int argc, char *argv[]) 
    {
      //initialisation des variables
      char * end, user, pass;
      char * dest=""; 
     
      //récupération des paramètres
        user=argv[1]; 
        pass=argv[2];   
     
        //je concatène les chaines user, et pass  
        strcat(dest,user); 
        strcat(dest,pass);
    }
    voila jpense que c mieux

  13. #13
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Ouais bon je vais pas chercher plus loin que ca, si tu n'alloue pas l'espace pointé par dest tu risques jamais de y arriver ! Tu dois allouer de l'espace suivant ce que vont prendre comme place les autres chaînes.

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
     
    int main (int argc, char ** argv)
    {
          char * dest = NULL;
     
     
          /* Test des arguments. */
          if (argc > 1)
          {
             /* Allocation d'un espace pour la chaîne */
             dest = malloc (strlen (argv[1]) + strlen (argv[2]) + 2);
     
             if (dest != NULL)
             {
                /* je concatène les chaines user, et pass */
                strcpy (dest, argv[1]);
                strcat (dest, ";");
                strcat (dest, argv[1]);
     
                printf ("Nom et pass : %s\n", dest);
     
     
                /* Liberation de la memoire allouee. */
                free (dest);
                dest = NULL;
             }
             else
             {
                fprintf (stderr, "Erreur pendant l'allocation de \"dest\" !\n");
                exit (EXIT_FAILURE);
             }
          }
          else
          {
             fprintf (stderr, "Arguments manquants !\n");
          }
     
     
          return EXIT_SUCCESS;
    }
    Bon voilà pour le code remanié. Maintenant passons à un truc qui m'a grandement choqué ...

    Tu crois qu'avec strtol tu vas récupérer des arguments, du moins correctement ? Tu as lu ce que fait cette fonction ? Lit bien: strtol elle convertie une chaîne en entier long

    Toi tu veux une chaîne et rien d'autre alors je vois franchement pas ce que tu as essayé de faire là.

    Juste un petit commentaire de fin sur ce que j'ai fait pour la concaténation. J'ai commencé par un strcpy car en fait, une fois la memoire allouée, elle n'est pas initialisée, elle contient donc des données indéfinies, donc pour éviter les ennuis du genre, des caractères inatendus, bin il faut correctement remplir le début soit par strcpy.

    Une autre solution pour éviter ce problème serait de faire un memset sur l'espace fraîchement alloué puis là tu peux commencer directement par un strcat !


    Voilà, si tu as des questions hésite pas

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 262
    Points : 230
    Points
    230
    Par défaut
    Personnellement, j'ai abandonne strcat, pour concatener j'utilise "sprintf".
    Essaye, tu vas voir, c'est une fonction qui gere presque l'infini ...
    De plus tu peux concatener plusieurs chaines de caracteres en l'appelant qu'une seule fois.

  15. #15
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par toxycyty
    Personnellement, j'ai abandonne strcat, pour concatener j'utilise "sprintf".
    Essaye, tu vas voir, c'est une fonction qui gere presque l'infini ...
    De plus tu peux concatener plusieurs chaines de caracteres en l'appelant qu'une seule fois.
    Oui c'est une solution parmis d'autres

  16. #16
    Membre éprouvé Avatar de Jérémy Lefevre
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Luxembourg

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 898
    Points : 969
    Points
    969
    Par défaut
    nan strtol était une erreur de ma part! où je voulait recupérer la valeur entiere d'un argument j'ai copier sans regarder désolé

  17. #17
    Membre éprouvé Avatar de Jérémy Lefevre
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Luxembourg

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 898
    Points : 969
    Points
    969
    Par défaut
    hmmm il y a un petit probleme la dans ton code dit moi si jme trompe mais malloc renvoi un void*!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void *malloc(size_t size);

  18. #18
    Membre éprouvé Avatar de Jérémy Lefevre
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Luxembourg

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 898
    Points : 969
    Points
    969
    Par défaut
    ok j'ai trouvé une alternative qui reprenait ton idée,
    j'ai compté la taille necessaire de mon chaine en comptant le nombre de caractères des mes arguments et j'ai fait un char monChar[nbDeCar]

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 589
    Points
    41 589
    Par défaut
    Citation Envoyé par jerem2000
    hmmm il y a un petit probleme la dans ton code dit moi si jme trompe mais malloc renvoi un void*!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void *malloc(size_t size);
    Et alors ?

  20. #20
    Membre éprouvé Avatar de Jérémy Lefevre
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Luxembourg

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 898
    Points : 969
    Points
    969
    Par défaut
    et alors tu declare dest en char* juste au dessus le compilo va pas trop aimé et c tout à fait normal

Discussions similaires

  1. concaténer deux char*
    Par ikuzar dans le forum C++
    Réponses: 6
    Dernier message: 28/03/2011, 19h31
  2. Opérateur de concaténation pour char *
    Par yves042 dans le forum C++
    Réponses: 2
    Dernier message: 06/05/2010, 11h12
  3. Réponses: 5
    Dernier message: 20/03/2009, 19h16
  4. [C++] Concaténer un char[50] avec un int
    Par Invité4 dans le forum C++
    Réponses: 10
    Dernier message: 07/04/2006, 15h54
  5. concaténation de char et float
    Par gup dans le forum C
    Réponses: 11
    Dernier message: 31/12/2005, 01h15

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