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 :

concatenation de char *


Sujet :

C

  1. #1
    Membre éclairé
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    593
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 593
    Par défaut concatenation de char *
    Bonjour,

    dans mon programmen en C, j'ai deux variables que je souhaite concatener, ces deux variables sont de type char *.

    je procède comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char *port;
    char * filter;
     
    sprintf(filter, filter, port);
    cependant a l'excution de ce code j'ai une erreur segmentation fault.
    Comment faire pour concatener deu pointeur?

    merci

  2. #2
    Membre éprouvé
    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
    Par défaut


    tu veux donc concatener des pointeurs? euh? j'ai du mal a te suivre la .

  3. #3
    Membre éclairé
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    593
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 593
    Par défaut
    lol, je me suis mal expliquer.

    j'ai un char * toto qui pointe sur toto.
    et un autre char * titi qui pointe su titi.

    Moi, je voudrais que *toto pointe sur tototiti.

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    Si c'est juste pour concaténer, fais ça avec strncat().
    Evidemment, le buffer de réception devra avoir été alloué et être suffisamment grand...

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 225
    Par défaut
    Ou bien tu te fait la concaténation à la main , c'est à dire enlever le 0 de toto et déplacer titi vers l'adresse de la fin de toto .
    Celà devrait marcher .

  6. #6
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    En C99 en utilisant les VLA:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    const char *toto="toto";
    const char *titi="titi";
    char temp[strlen(toto)+strlen(titi)+1];
    sprintf(temp,"%s%s",toto,titi);
    toto=temp;

    En ANSI-C:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    const char *toto="toto";
    const char *titi="titi";
    char *temp=calloc(strlen(toto)+strlen(titi)+1,1);
    sprintf(temp,"%s%s",toto,titi);
    toto=temp;
    en n'oubliant pas de libérer la mémoire allouée dynamiquement.

  7. #7
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Citation Envoyé par Dark_Ebola


    tu veux donc concatener des pointeurs? euh? j'ai du mal a te suivre la .
    Oui j'allais faire la meme remarque.

    Les variables de type char * ne sont pas des chaines

  8. #8
    Membre éclairé
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    593
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 593
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    const char *toto="toto";
    const char *titi="titi";
    char *temp=calloc(strlen(toto)+strlen(titi)+1,1);
    sprintf(temp,"%s%s",toto,titi);
    toto=temp;
    ca marche nickel!!

    j'ai juste quelque warning a la compile:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    futex@ubuntu:~/Documents/Sources/C/libpcap$ gcc -lpcap lib.c -o libcap
    lib.c: Dans la fonction «main» :
    lib.c:176: attention : incompatible implicit declaration of built-in function «calloc»
    lib.c:176: attention : incompatible implicit declaration of built-in function «strlen»
    lib.c:183: attention : incompatible implicit declaration of built-in function «exit»
    mais aucun soucis a l'execution
    Merci

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    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 398
    Par défaut
    #include <stdlib.h>
    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.

  10. #10
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    j'ai juste quelque warning a la compile:
    Et avec "#include <stdlib.h>" ?

  11. #11
    Membre éclairé

    Homme Profil pro
    Expert sécurité informatique
    Inscrit en
    Août 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Expert sécurité informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 33
    Par défaut les warnings
    Pour tes warnings à la compile : tu as pensé à mettre les bon #include dans ton fichier ?
    (string.h pour strlen, stdlib pour calloc et exit si j'me plante pas )


    edit : grillé par seriousme ^^

  12. #12
    Membre éclairé
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    593
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 593
    Par défaut
    en effet je les avait pas mis, .
    Tous est ok maitenant.

    Merci les gars :-)

  13. #13
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 225
    Par défaut
    Appeler d'autres fonction pour l'allocation dynamique , formattage des données ( sprintf ) consomme inutilement plusieurs cycles , et plusieurs millisecondes quand on les emploie dans une boucle .
    Voici une solution plus simple et plus rapide , on pourra enlever le 0 terminal de toto et déplacer titi vers la fin de toto , ça sera simple en assembleur , et en C , faut un peu bricoler avec les pointeurs .
    Bon disons que la valeur de toto est toto et celle de titi est titi .
    Chaque char se termine par un 0 qui indique sa fin , donc toto est en réalité toto\0 et titi est de même titi\0 .
    si on enléve le 0 terminal de toto , on aura toto suivi de caractéres bizarres contenus dans la mémoire ( puisque la chaine n'a plus une fin ! ) donc c'est dangereux .
    Mais si on déplace titi\0 vers la fin de toto , on aura tototiti\0 et c'est ce que nous cherchions à faire !
    Je serais interessé si quelqu'un a une solution plus rapide et plus simple .

  14. #14
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par bouazza92
    Appeler d'autres fonction pour l'allocation dynamique , formattage des données ( sprintf ) consomme inutilement plusieurs cycles , et plusieurs millisecondes quand on les emploie dans une boucle .
    Voici une solution plus simple et plus rapide , on pourra enlever le 0 terminal de toto et déplacer titi vers la fin de toto , ça sera simple en assembleur , et en C , faut un peu bricoler avec les pointeurs .
    Bon disons que la valeur de toto est toto et celle de titi est titi .
    Chaque char se termine par un 0 qui indique sa fin , donc toto est en réalité toto\0 et titi est de même titi\0 .
    si on enléve le 0 terminal de toto , on aura toto suivi de caractéres bizarres contenus dans la mémoire ( puisque la chaine n'a plus une fin ! ) donc c'est dangereux .
    Mais si on déplace titi\0 vers la fin de toto , on aura tototiti\0 et c'est ce que nous cherchions à faire !
    Je serais interessé si quelqu'un a une solution plus rapide et plus simple .
    qu'est ce qu'il ne te vas pas dans la solution de seriousme ? Et de toutes façons tu modifie la zone mémoire pointée par toto, ce qui n'est pas compatible avec les contraintes énoncées par Blo0d4x3. Sinon un simple str(n)cat suffit

  15. #15
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 225
    Par défaut
    Bon je confirme que cette manoeuvre est dangereuse mais si on veut que le code machine produit sera compact et léger , il ne faudra pas utiliser sprintf et calloc , et comme l'a dit gege2061 un strcat est simple et rapide , mais pas plus rapide que ma solution .
    Ajoutez -S aux paramétres du compilateur et comparez strcat et sprintf/calloc , vous allez voir que le code assembleur qui utilise strcat est plus compact que celui qui fait un sprintf/calloc déja qu'il y aura beaucoup de cmp pour comparer le caractére courant à un des carcatéres spéciaux ( %i , %s ... ) .
    Je vous conseille le timer zen de précision pour mésurer le temps d'execution de ces instructions .

  16. #16
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par bouazza92
    Bon je confirme que cette manoeuvre est dangereuse mais si on veut que le code machine produit sera compact et léger
    Ca c'est de l'optimisation. On ne fait cela que lorsque que le code est fonctionnel et que les sources d'etranglement ont ete identifiees.

  17. #17
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    Citation Envoyé par DaZumba
    Ca c'est de l'optimisation. On ne fait cela que lorsque que le code est fonctionnel et que les sources d'etranglement ont ete identifiees.
    Certains diraient :
    Premature optimization is the root of all evil.

  18. #18
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    I thought it was girls that were root of evil..

  19. #19
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Gruik
    I thought it was girls that were root of evil..
    premature girls actually !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/06/2009, 12h35
  2. [Preprocesseur] Concatenation de char
    Par TabrisLeFol dans le forum C
    Réponses: 17
    Dernier message: 22/01/2007, 20h53
  3. Concaténer un char et un num dans une variable
    Par ade05fr dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 24/10/2005, 17h32
  4. concatenation de char*
    Par wamania dans le forum C++
    Réponses: 19
    Dernier message: 05/08/2004, 18h01
  5. Réponses: 2
    Dernier message: 01/07/2004, 12h36

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