Partage
  • Partager sur Facebook
  • Partager sur Twitter

découper une phrase en mots stockés dans tableau

stocker les mots dans le tableau

Sujet résolu
    23 décembre 2013 à 16:07:53

    bonjour,

    dans le cours sur les structures, mon professeur de C nous a donné un programme, mais il manque la fonction decoupePhrase, et c'est cette fonction qui me pose problème. Voici le programme sans la fonction decoupePhrase:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    #define NB 3
    #define NBCAR 130
    
    typedef struct cle {
    	char *mot;
    	int compteur;
    }cle;
    
    void calculOccurence(cle lCLe[], char *mots[], int nb){
    	int i,j;
    	for(i=0; i<nb; i++)
    		for(j=0;j<NB;j++)
    		if(strcmp(mots[i], lCle[j].mot == 0)
    			lCle[j].compteur++;
    }
    
    void afficheListeCle(cle lCle[]){
    	int j;
    	for(j=0;j<NB; i++){
    		printf("mot cle: %s\t", lCLe[j].mot);
    		printf("nb d'occurrences: %d\n", lCle[j].compteur);
    	}
    
    }
    
    int main () {
    	char *motsPhrase[NBCAR];
    	cle lCle[NB] = {{"le",0},{"la",0},{"les", 0}};
    	int n;
    	decoupePhrase(motsPhrase &n);
    	calculOccurrence(lCle, motsPhrase, n);
    	afficheListeCle(lCle);
    	return EXIT_SUCCESS;
    }


    Pour la fonction decoupePhrase, je voulais faire deux programmes, un avec une saisie de chaîne de caractères en dimension fixe, et l'autre avec une saisie de chaînes de caractères de longueur variable allouée dynamiquement. J'ai commencé avec une saisie de chaîne en dimension fixe (l'autre devrait être très similaire), et ça ne marche pas (erreur de segmentation). Pourriez-vous m'éclairer? Voici mon programme :

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    #define NMAX 30
    #define NBCAR 130
    
    
    
    
    	
    
    void decoupePhrase(char *mots[], int *nb){
    	int i = 0, j = 0, k = 0;
    	char ch[NMAX] ;
    
    	printf("entrez une chaine d'au plus %d caractères: \n", NMAX-1);
    	fflush(stdout);
    	fgets ( ch, NMAX-1, stdin);
    
    	for (i = 0; i<NMAX; i++){
    		if(ch[i] = ' '){
    			*nb ++;
    		}
    	}
    	
    	for(j=0; ch[j] != ' '; j++)
    		*(mots[i] + j) = ch[j];
    	k = j+1;
    	j = 0;
    
    	for(i=1; i<*nb; i++){
    		for(k; ch[k] != ' '; k++){
    			*(mots[i] + j ) = ch[k];
    			j++;
    		}
    		k = k+1;
    		j = 0;
    	}
    	for(i=1; i<=*nb; i++)
    		printf("%d%s chaine: %s\n", i, (i==1)?"ère" : "ème", mots[i-1]);
    }
    
    int main () {
    	int n = 1;
    	char *motsPhrase[NBCAR];
    	
    	decoupePhrase (motsPhrase, &n);
    	
    	return EXIT_SUCCESS;
    }
    
    




     merci d'avance pour l'aide.

    -
    Edité par twitty 23 décembre 2013 à 16:35:37

    • Partager sur Facebook
    • Partager sur Twitter
      23 décembre 2013 à 16:26:23

      Une erreur de segmentation. Le problème vient très certainement d'une mauvaise façon d'utiliser les pointeurs.

      Lors de la création du pointeur motsPhrase, l'utilisation d'un malloc ne serait pas utile?

      char * motsPhrase = NULL;
      motsPhrase = malloc(NBCAR * sizeof(char)); 

      Cdt,

      Kabilou



      -
      Edité par kabilou 23 décembre 2013 à 16:26:46

      • Partager sur Facebook
      • Partager sur Twitter
      "Software is like sex, it’s better when it’s free"
        23 décembre 2013 à 21:22:58

        merci! j'ai en effet oublié d'allouer les pointeurs. char * motsPhrase[NBCAR] étant un tableau de POINTEURS de caractères, il faut allouer chaque pointeur comme tu l'as bien remarqué. J'ai donc fait une boucle et je n'ai plus d'erreur de segmentation. Par contre, mon code ne marche pas, mais ça, c'est une autre histoire. Je vous tiens au courant si j'y arrive, mais si je n'y arrive pas, je veux bien un peu d'aide!

        merci pour ta réponse Kabilou, c'est une remarque importante !

        • Partager sur Facebook
        • Partager sur Twitter
          23 décembre 2013 à 22:56:00

          si quelqu'un a des indices pour résoudre ce problème, je veux bien! J'ai beaucoup réfléchi mais je n'y arrive pas! Voici mon raisonnement: On saisit une phrase. Tant que le caractère de la phrase saisie  est différent de ' ', je le stocke  dans le tableau de pointeurs de caractères. Si j'appelle motsPhrase mon tableau de pointeurs de caractères, motsPhrase[0] contient l'adresse de la chaîne de caractères qui est le premier mot de la phrase saisie, motsPhrase[1] contient l'adresse de la chaîne de caractères qui est le deuxième mot de la phrase saisie...Je me sert du caractères espace pour délimiter les mots.
          • Partager sur Facebook
          • Partager sur Twitter
            23 décembre 2013 à 23:31:57

            Salut, Regarde ta ligne 22...

            • Partager sur Facebook
            • Partager sur Twitter
            parce que j'étais root toute la sainte journée, je n'ai pas vu le doute en moi s’immiscer ...
              25 décembre 2013 à 22:22:33

              oui merci je n'avais pas vu
              • Partager sur Facebook
              • Partager sur Twitter
                26 décembre 2013 à 10:38:13

                C'est résolu ? si oui met le sujet en résolu. Ps : mets voidentre les parenthèses lorsque tu n'as pas d'argument.

                • Partager sur Facebook
                • Partager sur Twitter
                parce que j'étais root toute la sainte journée, je n'ai pas vu le doute en moi s’immiscer ...
                  27 décembre 2013 à 20:09:31

                  non le code ne marche toujours pas...j'ai besoin de conseils! peut-être que je m'y prends mal...
                  • Partager sur Facebook
                  • Partager sur Twitter
                    28 décembre 2013 à 1:02:51

                    Bon définie clairement ton algo mais d'abord pourquoi avoir choisi ce prototype

                    void    decoupePhrase(char *mots[], int *nb)
                    ?

                    -
                    Edité par Masta_π 28 décembre 2013 à 1:03:23

                    • Partager sur Facebook
                    • Partager sur Twitter
                    parce que j'étais root toute la sainte journée, je n'ai pas vu le doute en moi s’immiscer ...
                      28 décembre 2013 à 8:07:49

                      Salut,

                      Je trouve tout ça bien compliqué...

                      Vu qu'à priori tu n'as pas besoin de conserver la forme de la table d'acquisition, pourquoi ne pas la modifier et retourner une table de pointeurs sur char ?

                      Tu alloues une table pour ta saisie, une fois fait, tu comptes le nombre de mots, tu alloues un tableau de char* du nombre de mots, le premièr indice est égal à la phrase, puis pendant que tu remplaces tous les espaces par des nul, tu envoies l'adresse suivante à ta table de char*...

                      évidemment faudra libérer tab[0] et tab à la fin de ton programme.

                      Heu pas certain que mes explications soient très claires, et j'hésite à te donner du code s'il s'agit d'un exercice, mais voici l'idée en image :

                      Voilà l'idée.

                      • ça t'évite de recopier les mots un à un, l'utilisateur les rentre pour toi, la recopie c'est quand on est puni...
                      • Tu n'as pas à t'occuper pas de la taille des mots.
                      • ça se fait en une dizaine de lignes.
                      • Le seul truc "bizarre" est d'avoir à libérer table[0] puis table...

                      Ensuite, compter le nombre de mots, j'en ferais une fonction à part, c'est le genre de petit truc qui peut toujours servir ailleurs. Tout comme la saisie utilisateur, je la ferais à part, ça dénature la fonction de ta...fonction, vu son nom j'entends...

                      Bonne continuation.

                      -
                      Edité par drx 28 décembre 2013 à 8:37:10

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Bonhomme !! | Jeu de plateforme : Prototype.

                        30 décembre 2013 à 18:58:30

                        Masta_π: j'ai choisi ce prototype car c'est notre prof qui nous l'a donné.

                        drx: merci pout tes explications, elles m'éclairent beaucoup et je vais essayer de respecter ce que tu as dit. Pour mon code, en effet, j'ai tendance à compliquer les choses!

                        • Partager sur Facebook
                        • Partager sur Twitter
                          30 décembre 2013 à 19:40:06

                          Merci beaucoup drx! tes explications sont tellement claires que j'ai réussi a résoudre mon problème. Je ne sais pas si je peux où pas mettre mon code source. En effet, si d'autres personnes veulent chercher et aussi à case des règles . Pour l'instant, j'ai tout mis dans le main, mais je peux l'améliorer comme tu l'as dit.
                          • Partager sur Facebook
                          • Partager sur Twitter

                          découper une phrase en mots stockés dans tableau

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown