Concatenation : contenu d'un element dela lis

Bonjour à tous les developpeurs ici presents,
jai une fonction qui boucle sur tte une liste chaine en affichant le contenu , le probleme c'est que je sais pas comment faire pour concatener le contenu et une chaine de caractere (espace) lors de l'aafichage
merci
je compte sur vous
Configuration: Windows XP
Internet Explorer 7.0

21 réponses

Résumé de la discussion

Le problème porte sur la concaténation des éléments d'une liste de chaînes en C avec un espace lors de l'affichage, afin d'obtenir une phrase constituée des mots successifs sans perte. La solution clé consiste à déclarer et allouer une chaîne tampon, puis, dans la boucle, utiliser strcat(concat, p->mot) et afficher le mot, en veillant à inclure . D'autres détails pratiques incluent la gestion correcte de la mémoire pour éviter les débordements et l'assurance que concat est bien dimensionné avant d'appeler strcat à chaque itération. En pratique, il faut dimensionner le buffer en fonction du nombre et de la longueur des mots et prévoir une étape optionnelle pour gérer les espaces finaux.

Bobot (l’IA à votre service)
  1. c'est en quel langage?
    0
    1. en C

      voila la fonction d'affichage

      void AfficherListe(Liste *L){
        Liste *p;
        for(p=L;p!=NULL;p=p->suivant){
          AfficheMot(p->mot);
          AfficherCoordonnees(p->c);
        }
      }
      
      
      
      
      void AfficheMot(char *mot){
        printf("%s ",mot,"                                             " );
      }
      0
  2. man strcat ?

    http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/strcat.3.html
    0
    1. OUI C LA FONCTION LA PLUSS IMPLE POUR CONCATENER
      0
      1. merci à kazou et à toi ribery, mais ccamon probleme ; c'est que je sais pas comment mettre cette fonction dans mon code :(
        0
    2. tu utilises quel envirronement de développement??
      0
      1. DEV c++
        0
    3. tu déclares un char* concat
      par exemple et a chaque fois dans ta fonction tu fais

      void AfficherListe(Liste *L){
      Liste *p;
      for(p=L;p!=NULL;p=p->suivant){
      strcat(concat,p->mot);
      AfficheMot(p->mot);
      AfficherCoordonnees(p->c);
      }
      }

      en faisant gaffe de bien alloué ta chaine concat et #include <string.h>
      0
      1. ma chaine concat est un espace " ", car je veux espacer les mots
        0
    4. la fonction concatener est une fonction qui regroupe deux chaines de caractéres
      tu veux regrouper quelles chaines?
      0
      1. moi je fais un affichage de tous les mots se trouvant dans un liste chainee, le probleme c'est que lors de laffichage il m'affiche les mots collés exp : ilfaitbeau au lieu de "il fait beau" donc moi jaime faire un espace apres chaque affichage dd'un mot
        ctout
        merci
        0
      2. ta une idée svp ribery?
        0
    5. tu n'as pas compris ta chaine concat est la chaine ou il y aura tout tes mot si tu veux rajouter un espace tu fais

      void AfficherListe(Liste *L){
      Liste *p;
      for(p=L;p!=NULL;p=p->suivant){
      strcat(concat,p->mot);
      strcat(concat,' ');
      AfficheMot(p->mot);
      AfficherCoordonnees(p->c);
      }
      }
      0
      1. ah lol ^^
        il suffit de faire

        void AfficheMot(char *mot){
        printf("%s \n",mot" );
        }
        0
        1. non kazouu
          il a fait un retour chariot
          :(
          0
      2. essai en mettant un espace entre " et %s

        void AfficheMot(char *mot){
        printf(" %s",mot" );
        }
        0
        1. non!!
          tu plaisante l? :)
          0
      3. non il ne doit pas prendre en compte les espace apres les % mais avant je pense qu'il les prend essai ca coute rien
        0
        1. je sais , merci
          ta une autre idée?
          0
      4. ça marche pas ?
        0
        1. non , c la meme chose !!
          0
      5. attend j'ai bien compris tu veux afficher tes mot et des espaces entres chaque mot ?

        essai

        void AfficheMot(char *mot){
        printf("%s",mot );
        printf(" " );
        }

        sinon après je vois pas
        0
        1. ok :)
          ca marche pas
          0
      6. je peux te proposer

        printf("%s \t",mot" );

        mais ca va mettre plusieurs espace c'est peut être mieux que rien
        0
        1. il na fait aucun espace
          0
        2. je^pense que le probleme est au niveau de cette instruction

          Code :
          AfficheMot(p->mot);

          là où il faut ajouter un espace
          0
      7. ya un probleme chez toi parce que moi quand je fais

        #include <stdio.h>
        #include <stdlib.h>
        int main(void){
        char* c ="blabla";
        printf("%s ",c);
        printf("%s",c);
        system("pause");
        return 0;

        }

        ca m'affiche "blabla blabla"
        0
        1. cpas le cas chez moi
          ilaffiche blablabalabla
          0
      8. c'est quoi ta config ?
        t'es sous linux ? windows ?
        32 , 64 bit ?
        0
        1. ben je travaille sous windows
          0
      9. c'est très très bizarre

        et si tu fais ca ?

        #include <stdio.h>
        #include <stdlib.h>
        int main(void){
        char c[7] ="blabla";
        printf("%s ",c);
        printf("%s",c);
        system("pause");
        return 0;

        }
        0
        1. oui, quandjai testé ca dans un nouveau projet , ca marche: blabla blabla
          0
      10. ya un probleme autre par dans ton code alors
        colle le ( lisiblement )
        0
        1. ok :) merci
          #include<stdio.h>
          #include<stdlib.h>
          #include<string.h>
          
          #include "table_hash.h"
          #define TAILLEHASH 307
          
          
          int main()
          {
            FILE *F;
            char mot[100];
            int i;
            unsigned int cle,pt;
            int nl, pos;
            nl=pos=1;
            char c;
            int seuil;
            Liste **L;
          
            Liste **TableHash;
            TableHash = (Liste **) malloc (TAILLEHASH * sizeof(Liste *));
            for(i=0;i<TAILLEHASH;++i)
              TableHash[i] = NULL;
          
            pt=hash_cle(".");
            //printf("%d",pt);
          
            printf("debut du programme \n----------------------------------\n");  
            F=fopen("C:\\Documents and Settings\\siril\\Bureau\\projetcyrine\\text.txt","r");
            while(fscanf(F,"%s",mot)==1){
                 cle = hash_cle(mot);
                if ((cle!=pt ) && (! ChercherMotDansTableHash(TableHash,mot)))
                      TableHash[cle] = InsertionEnTete(TableHash[cle],mot);     
            }
            fclose(F );
            F=fopen("C:\\Documents and Settings\\siril\\Bureau\\projetcyrine\\text.txt","r");
            PosLigne(F,TableHash);
            
            //filtrage 
            printf("\nla liste filtre :\n----------------------------------\n");
            FiltreListe(TableHash,2);
            AfficherTableHash(TableHash);
          
            //géneration des 2seq
            Liste *seq=NULL;
            Generer2seq(TableHash, 2, &seq);
            printf("\nla liste des 2seq :\n----------------------------------\n");
            AfficherListe(seq);
            //printf("Chercher mot : ");
            //scanf("%s",mot);
            //if(cle = ChercherMotDansTableHash(TableHash,mot))
            //  printf("%s existant dans le conteneur %u\n",mot,hash_cle(mot));
            //else
            //  printf("%s inexistant dans la table de hash\n");
            scanf("%c",c);
              
            return 0;
          }
          
          
          
          
          void ParcourirElementTableHash(Liste **TableHash,char *mot){
            int cle;
            Liste *p;
            cle = hash_cle(mot);
          
            for(p=TableHash[cle];p!=NULL;p=p->suivant)
              if(strcmp(mot,p->mot) == 0){
                printf("%s : ",mot);
                AfficherCoordonnees(p->c);
              }
          }
          
          
          
          
          
          
          
          
          
          Liste *InsertionEnTete(Liste *L,char *mot){
            Liste *nouveau;
            nouveau = (Liste *) malloc (sizeof(Liste));
            strcpy(nouveau->mot,mot);
            nouveau->suivant = L;
            nouveau->c = NULL;
            return nouveau;
          }
          
          Coordonnees *InsertionEnTeteCoordonnee(Coordonnees *C,int nl ,int pos){
            Coordonnees *nouveau;
            nouveau = (Coordonnees *) malloc (sizeof(Coordonnees));
            nouveau->pos = pos;
            nouveau->nl = nl;
            nouveau->suivant = C;
            return nouveau;
          }
          
          void AfficherListe(Liste *L){
            Liste *p;
            for(p=L;p!=NULL;p=p->suivant){
              AfficheMot(p->mot);
              
              AfficherCoordonnees(p->c);
            }
          }
          
          void AfficherCoordonnees(Coordonnees *C){
            Coordonnees *p;
            for(p=C;p!=NULL;p=p->suivant)
          	  printf(" (%d,%d) ",p->nl,p->pos);
            printf("\n");
          }
          
          void AfficheMot(char *mot){
               char *espace;
               espace =" ";
            printf("%s",mot );
            printf("%s",espace);
           
          
          }
          
          unsigned int hash_cle(char *mot){
            unsigned int val = 0;
            for(;*mot!='\0';++mot)
              val = *mot + 31 * val;
            return val % TAILLEHASH;
          }
          
          void AfficherTableHash(Liste **TableHash){
            int i;
            for(i=0;i<TAILLEHASH;++i)
              if(TableHash[i] != NULL){
                printf("Conteneur %d \n",i);
                AfficherListe(TableHash[i]);
                printf("----------------------------------\n");
              }
          }
          
          unsigned int ChercherMotDansTableHash(Liste **TableHash,char *mot){
            
            Liste *p;
            unsigned int cle;
            
            cle = hash_cle(mot);
            for(p=TableHash[cle];p!=NULL;p=p->suivant)
              if(strcmp(p->mot,mot)==0)
                return 1;
            return 0;
          }
          
          void FiltreListe(Liste **TableHash, int seuil){
          
            Liste *p ,*last;
            Coordonnees *c;
            int i,supp=0,nb=0;
            for(i=0;i<TAILLEHASH;++i)
              if(TableHash[i] != NULL){
               nb=0;
               last=TableHash[i];
               for(p=TableHash[i];p!=NULL;p=p->suivant){
                supp=0;
                nb++;
                for(c=p->c;c!=NULL;c=c->suivant)
          	     supp++;
            
               if( supp <seuil){ // mot n'est pas frequent
                 if (last==p) // cas du première mot
                   {
                      TableHash[i]=p->suivant;
                      last=p->suivant;
                   }
                 else
                    last->suivant=p->suivant;
                 nb--;
              }else
             last=p;
             }
             if (nb==0)
                TableHash[i] = NULL;
            }
          }
          
          void Generer2seq(Liste **TableHash, int seuil, Liste **seq){
          
            Liste *p1, *p2, *ss,*t;
            Coordonnees *c1,*c2;
            int i,j,supp1=0,supp2=0,nb=0;
            char s1[50], s2[50],*t1,*t2;
            ss=*seq;
            printf("\nconstruction des 2seq \n---------------\n");
            for(i=0;i<TAILLEHASH;++i)
              if(TableHash[i] != NULL)
               for(p1=TableHash[i];p1!=NULL;p1=p1->suivant)
                   for(j=i;j<TAILLEHASH;++j)
                       if(TableHash[j] != NULL){
                          if (j==i)
                              t=p1;
                              else
                              t=TableHash[j];
                          for(p2=t;p2!=NULL;p2=p2->suivant){
                                 
                                 if (strcmp(p1->mot,p2->mot)!=0){   // si 2 mots differents trouvés
                                  Liste *tmp1=NULL, *tmp2=NULL;
                                  strcpy(s1,p1->mot);
                                  strcpy(s2,p2->mot);
                                  t1=strcat(s1,p2->mot);
                                  t2=strcat(s2,p1->mot);
                                  tmp1=InsertionEnTete(tmp1,s1);
                                  tmp2=InsertionEnTete(tmp2,s2);
                                  
                                  printf("creation TMP1 et TMP2 : %s ,%s\n",s1,s2);
                                  supp1=0;supp2=0;
                                  for(c1=p1->c;c1!=NULL;c1=c1->suivant)  // calcule de supp
                                   for(c2=p2->c;c2!=NULL;c2=c2->suivant){
                                     if (c1->nl == c2->nl){
                                       if(c1->pos < c2->pos){
                                           tmp1->c=InsertionEnTeteCoordonnee(tmp1->c,c1->nl ,c2->pos);    
                                           supp1++;
                                           }
                                       else{
                                           tmp2->c=InsertionEnTeteCoordonnee(tmp2->c,c1->nl ,c1->pos);
                                           supp2++;
                                           }
                                       }
                                   }   // fin calcul supp
                                   if(supp1>=seuil){
                                      //printf("%d ",supp1);
                                      if (*seq==NULL)
                                        *seq=tmp1;
                                      else  
                                        ss->suivant=tmp1;
                                      ss=tmp1;
                                    //printf("%s : OK1\n",tmp1->mot);
                                   }
                                   if(supp2>=seuil){
                                      //printf("%d ",supp2);
                                      if (*seq==NULL)
                                        *seq=tmp2;
                                      else  
                                        ss->suivant=tmp2;
                                      ss=tmp2;
                                    //printf("%s : OK2\n",tmp2->mot);
                                  }
                              } // fin de traitement des mot
                           //printf("fin");
                           }
                       }
                       printf("////fin calcule 2seq\n");
          }
          
          
          
          void PosLigne(FILE *F,Liste **TableHash){
            char s[50];
            int nl,pos,i;
            Liste *p;
            nl=pos=1;
          
            while(fscanf(F,"%s",s)==1){
              for(i=0;i<TAILLEHASH;++i)
                if(TableHash[i]!=NULL)
                  for(p=TableHash[i];p!=NULL;p=p->suivant)
                    if(strcmp(p->mot,s)==0)
                      p->c=InsertionEnTeteCoordonnee(p->c,nl ,pos);
              if(fgetc(F)=='\n'){
                ++nl;
                pos=0;
              }
              ++pos;
            }
            printf("\n");
          }


          table-hachage.h
          #ifndef TABLE_HASH
          #define TABLE_HASH
          
          typedef struct c{
          	int pos;
          	int nl;
          	struct c *suivant;
          }Coordonnees;
          
          typedef struct L{
          	char mot[50];
          	Coordonnees *c;
          	struct L *suivant;
          }Liste;
          
          
          Liste *InsertionEnTete(Liste *L,char *mot);
          Coordonnees *InsertionEnTeteCoordonnee(Coordonnees *C,int nl,int pos);
          void AfficherListe(Liste *L);
          void AfficherCoordonnees(Coordonnees *C);
          void AfficheMot(char *mot);
          unsigned int hash_cle(char *mot);
          void AfficherTableHash(Liste **TableHash);
          unsigned int ChercherMotDansTableHash(Liste **TableHash,char *mot);
          void PosLigne(FILE *F,Liste **TableHash);
          void frequent( Liste **TableHash , int mc);
          void ParcourirElementTableHash(Liste **TableHash,char *mot);
          void FiltreListe(Liste **L, int seuil);
          void Generer2seq(Liste **TableHash, int seuil, Liste **seq);
          #endif
          0
      11. tu as essayé en declarant un char * au lieu de char[50] ?
        0
        1. non
          0
      12. ben essaye

        typedef struct L{
        char* mot;
        Coordonnees *c;
        struct L *suivant;
        }Liste;
        0
        1. en changeant seulemnt cette partie rien ne change :(
          0
      13. derniere essaie

        essai de faire tout dans la meme fonction

        void AfficherListe(Liste *L){
        Liste *p;
        for(p=L;p!=NULL;p=p->suivant){
        fprint(stderr,"%s ",p->mot);

        AfficherCoordonnees(p->c);
        }
        }
        0
        1. decette facon il yaura des bugs, des warning.
          en tout cas merci kazzou pur ton effort.
          je vles laisser comme ca carla je suis trop crevée
          0
      • 1
      • 2