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! 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 !
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.
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...
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!
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.
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.
Bonhomme !! | Jeu de plateforme : Prototype.