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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 40
    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
    Rien ne se perd, rien ne se crée, tout se transforme

    ------- -------

  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.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  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
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  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.
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  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 !
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  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 !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  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 : 40
    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
    Rien ne se perd, rien ne se crée, tout se transforme

    ------- -------

  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.
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  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 : 40
    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*
    Rien ne se perd, rien ne se crée, tout se transforme

    ------- -------

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 376
    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 376
    Points : 41 545
    Points
    41 545
    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...
    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.

  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
    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
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

Discussions similaires

  1. concaténer deux char*
    Par ikuzar dans le forum C++
    Réponses: 6
    Dernier message: 28/03/2011, 18h31
  2. Opérateur de concaténation pour char *
    Par yves042 dans le forum C++
    Réponses: 2
    Dernier message: 06/05/2010, 10h12
  3. Réponses: 5
    Dernier message: 20/03/2009, 18h16
  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, 14h54
  5. concaténation de char et float
    Par gup dans le forum C
    Réponses: 11
    Dernier message: 31/12/2005, 00h15

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