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 :

Pardon par avance : Concaténation de chaîne de caractères


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Novembre 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 18
    Par défaut Pardon par avance : Concaténation de chaîne de caractères
    Bonjour à tous,

    je deviens dingue et je rage comme un fou tellement ça m'énerve. Je suis complètement désolé par avance parce que la question a du être gérée un milliard de fois.

    J'ai regardé la FAQ avant de venir ici mais elle ne répond pas à ma question car elle ne traite que chaînes de longueur fixées (char[50], char[100], etc. etc.)

    Je souhaite faire quelque chose d'incommensurablement complexe et original : concaténer dans une chaîne de caractère de taille indéfinie (un char * quoi) une variable chaîne dont je peux fixer la longueur là par contre, mais dont le contenu va varier

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char * chaine_finale ;
    char[50] mon_buffer ;
    au lancement : je veux que chaine_finale = "" et mon_buffer = "tour 1;" par exemple
    et mettre le contenu de mon_buffer à la suite du contenu de chaine_finale.

    tour 2 : chaine_finale vaut "tour 1;" et mon_buffer vaut "tour 2;".
    tour 3 : chaine_finale vaut "tour 1;tour 2;" et mon_buffer vaut "tour 3;".
    ...
    tour n : chaine_finale vaut "tour 1;tour 2;...;tour n-1;" et mon_buffer vaut "tour_n".

    me dites pas qu'il faut que je passe par du malloc ou du realloc quand même ... ? si ? y a pas de librairie ni de fonctions qui encapsule la gestion de concaténation dynamique de chaîne en C ?

    Help par pitié je vais finir par tuer le chien (qui n'a rien fait) tellement ça m'énerve !

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 315
    Billets dans le blog
    5
    Par défaut
    Bonjour.

    Le prototype de la fonction est-il libre ou imposé ?

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Pourtant dans la FAQ il y a les solutions avec sprintf et strcat.
    https://c.developpez.com/faq/?page=L...-de-caracteres
    Que les chaînes soient déclarées comme [length] n'a absolument aucune incidence, il suffit de regarder les prototypes de ces fonctions pour s'en assurer.
    Et oui si ta chaîne qui reçoit les données n'est pas assez grande, il va bien évidemment falloir passer par du malloc/realloc.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Membre averti
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Novembre 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 18
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Pourtant dans la FAQ il y a les solutions avec sprintf et strcat.
    https://c.developpez.com/faq/?page=L...-de-caracteres
    Que les chaînes soient déclarées comme [length] n'a absolument aucune incidence, il suffit de regarder les prototypes de ces fonctions pour s'en assurer.
    Et oui si ta chaîne qui reçoit les données n'est pas assez grande, il va bien évidemment falloir passer par du malloc/realloc.
    Comme je l'ai dit dans mon premier message, j'avais bien sûr été voir la FAQ avant d'aller poser une question que je sais être posée déjà mille fois.

    j'ai regardé les prototypes et du coup oui je ne comprends pas parce que pour moi ça devrait marcher :

    le proto de strcat est le suivant, sauf erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *strcat(char *dest, const char *src)
    or dans mon test, je lui passe bien un char * en premier argument :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char * chaine_finale = "GRRRRRR!" ;
    ...
    strcat(chaine_finale ,"POUUUUUUUUUUUUUUUUUET");
    Et derrière j'ai un Seg Fault à chaque fois ... d'où mon incompréhension. :'(

    Quant au malloc ou realloc, j'avais le secret espoir qu'il y avait des fonctions qui encapsulaient déjà ce type de fonctionnalités tellement ce type de besoin me semble fréquent ...

  5. #5
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 315
    Billets dans le blog
    5
    Par défaut
    Dans ce bout de code chaine_finale est de taille finie. En y ajoutant des données tu dépasses sa taille. D’où Le segdefault.

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    C'est surtout que ce code essaye d'écrire dans la mémoire constante... Aucune RAM n'est ici allouée pour stocker les caractères.

  7. #7
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 315
    Billets dans le blog
    5
    Par défaut
    Je répondrais donc comme tu le soupçonnes. Passer par un malloc / free me semble être le plus simple.

    Tu pourrais par exemple faire ceci en considérant que les chaînes transmises sont correctement formatées, c’est à dire se terminant par \0. De plus si on part du principe que la chaîne destination str1 est allouée dans le tas alors on peut la liberer dans la même fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char *perso_strcat (char *str1, char *str2)
    {
      char *result = malloc (strlen (str1) + strlen (str2) + 1);
      result = strcpy (result, str1);
     
      result = strcat (result, str2);
     
      free (str1); // à voir en fct de ton code
      return result;
    }
    Je n’ai pas testé ce code mais l’idée générale est là.

  8. #8
    Membre averti
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Novembre 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 18
    Par défaut
    Bonjour et merci de votre réponse

    Je ne suis pas sûr de bien comprendre la question.

    En fait en reprenant mon exemple précédent, ma "chaine_finale" est une ressource partagée.

    J'ai un thread qui vient la remplir (avec mon_buffer du coup dans mon exemple)

    Et derrière j'ai un autre thread qui vient "vider" cette chaîne dans un fichier selon d'autres critères

    Je peux bien sûr partir sur une taille fixe surdimensionnée, mais je trouve ça moche d'aller allouer 500000 char de mémoire si je n'en utilise au max que 5000 :s

    Vous parlez du prototype de ma fonction du premier thread du coup ?

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/08/2007, 09h53
  2. Concaténation de chaînes de caractères
    Par Sakapatate dans le forum Débuter
    Réponses: 15
    Dernier message: 16/06/2007, 22h19
  3. Concaténation de chaîne de caractères
    Par Ardely dans le forum Delphi
    Réponses: 6
    Dernier message: 31/01/2007, 19h10
  4. Réponses: 3
    Dernier message: 14/04/2006, 09h57
  5. concaténation de chaîne de caractère
    Par jh0483 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 08/08/2005, 17h10

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