Concatenation : contenu d'un element dela lis

stroumpf Messages postés 292 Statut Membre -  
kazouu Messages postés 466 Statut Membre -
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

  • 1
  • 2
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 <string.h>. 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.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. ribery_7_91 Messages postés 240 Statut Membre 16
     
    c'est en quel langage?
    0
    1. stroumpf Messages postés 292 Statut Membre 2
       
      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. kazouu Messages postés 466 Statut Membre 12
     
    man strcat ?

    http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/strcat.3.html
    0
  3. ribery_7_91 Messages postés 240 Statut Membre 16
     
    OUI C LA FONCTION LA PLUSS IMPLE POUR CONCATENER
    0
    1. stroumpf Messages postés 292 Statut Membre 2
       
      merci à kazou et à toi ribery, mais ccamon probleme ; c'est que je sais pas comment mettre cette fonction dans mon code :(
      0
  4. ribery_7_91 Messages postés 240 Statut Membre 16
     
    tu utilises quel envirronement de développement??
    0
    1. stroumpf Messages postés 292 Statut Membre 2
       
      DEV c++
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. kazouu Messages postés 466 Statut Membre 12
     
    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. stroumpf Messages postés 292 Statut Membre 2
       
      ma chaine concat est un espace " ", car je veux espacer les mots
      0
  7. ribery_7_91 Messages postés 240 Statut Membre 16
     
    la fonction concatener est une fonction qui regroupe deux chaines de caractéres
    tu veux regrouper quelles chaines?
    0
    1. stroumpf Messages postés 292 Statut Membre 2
       
      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. stroumpf Messages postés 292 Statut Membre 2
       
      ta une idée svp ribery?
      0
  8. kazouu Messages postés 466 Statut Membre 12
     
    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
  9. kazouu Messages postés 466 Statut Membre 12
     
    ah lol ^^
    il suffit de faire

    void AfficheMot(char *mot){
    printf("%s \n",mot" );
    }
    0
    1. stroumpf Messages postés 292 Statut Membre 2
       
      non kazouu
      il a fait un retour chariot
      :(
      0
  10. kazouu Messages postés 466 Statut Membre 12
     
    essai en mettant un espace entre " et %s

    void AfficheMot(char *mot){
    printf(" %s",mot" );
    }
    0
    1. stroumpf Messages postés 292 Statut Membre 2
       
      non!!
      tu plaisante l? :)
      0
  11. kazouu Messages postés 466 Statut Membre 12
     
    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. stroumpf Messages postés 292 Statut Membre 2
       
      je sais , merci
      ta une autre idée?
      0
  12. kazouu Messages postés 466 Statut Membre 12
     
    ça marche pas ?
    0
    1. stroumpf Messages postés 292 Statut Membre 2
       
      non , c la meme chose !!
      0
  13. kazouu Messages postés 466 Statut Membre 12
     
    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. stroumpf Messages postés 292 Statut Membre 2
       
      ok :)
      ca marche pas
      0
  14. kazouu Messages postés 466 Statut Membre 12
     
    je peux te proposer

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

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

      Code :
      AfficheMot(p->mot);

      là où il faut ajouter un espace
      0
  15. kazouu Messages postés 466 Statut Membre 12
     
    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. stroumpf Messages postés 292 Statut Membre 2
       
      cpas le cas chez moi
      ilaffiche blablabalabla
      0
  16. kazouu Messages postés 466 Statut Membre 12
     
    c'est quoi ta config ?
    t'es sous linux ? windows ?
    32 , 64 bit ?
    0
    1. stroumpf Messages postés 292 Statut Membre 2
       
      ben je travaille sous windows
      0
  17. kazouu Messages postés 466 Statut Membre 12
     
    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. stroumpf Messages postés 292 Statut Membre 2
       
      oui, quandjai testé ca dans un nouveau projet , ca marche: blabla blabla
      0
  18. kazouu Messages postés 466 Statut Membre 12
     
    ya un probleme autre par dans ton code alors
    colle le ( lisiblement )
    0
    1. stroumpf Messages postés 292 Statut Membre 2
       
      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
  19. kazouu Messages postés 466 Statut Membre 12
     
    tu as essayé en declarant un char * au lieu de char[50] ?
    0
    1. stroumpf Messages postés 292 Statut Membre 2
       
      non
      0
  20. kazouu Messages postés 466 Statut Membre 12
     
    ben essaye

    typedef struct L{
    char* mot;
    Coordonnees *c;
    struct L *suivant;
    }Liste;
    0
    1. stroumpf Messages postés 292 Statut Membre 2
       
      en changeant seulemnt cette partie rien ne change :(
      0
  21. kazouu Messages postés 466 Statut Membre 12
     
    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. stroumpf Messages postés 292 Statut Membre 2
       
      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