fonction compter mot identique entre deux chaines

fonction compter mot identique entre deux chaines - C - Programmation

Marsh Posté le 13-04-2011 à 18:11:06    

salut,
je developpe un programme qui contient une fonction qui permet de calculer le nombre de mots identiques entre deux chaine passé en paramètre de la fonction.
j'ai pas eu le résultat satisfaisant.le clacule est faux.voila le code de la fonction:

Code :
  1. int compter_mot_identique(char *L1, char *L2,int a,int b)
  2. {
  3.  int k=0, m=0,j=0,nb=0;
  4.  int i;
  5.  char LL1[20]="";
  6.  char LL2[20]="";
  7.    for(i=0;i<a+1;i++)
  8.   {
  9.    while(L1[i]!=' ')
  10.    {
  11.     LL1[k]=L1[i];
  12.     k++;
  13.     i++;
  14.    }
  15.    for(j=0;j<b+1;j++)
  16.    {
  17.     while(L2[j]!=' ')
  18.       {
  19.       LL2[m]=L2[j];
  20.       m++;
  21.       j++;
  22.       }
  23.     if (strcmp(LL1,LL2)==0)
  24.       {
  25.        nb++;
  26.       }
  27.      memset (LL2, 0, sizeof (LL2));
  28.      k=0;
  29.      m=0;
  30.    }
  31.    memset (LL1, 0, sizeof (LL1));
  32.   }
  33.   return(nb);
  34. }


 
a et b qui sont passé en paramètre sont la longueur de ch1 et ch2 respectivement.
j'ai besoin de l'aide svp.

Reply

Marsh Posté le 13-04-2011 à 18:11:06   

Reply

Marsh Posté le 13-04-2011 à 21:52:14    

1. Il est recommandé de toujours mettre un zéro binaire à la fin d'une chaîne de caractères. C'est notamment nécessaire quand on veut ensuite utiliser les fonctions strcmp(), strcpy(), etc.
Par exemple, ici, avant la ligne 25, il faudrait ajouter LL2[m] = '\0';
 
2. Attention à sizeof(). Si on l'utilise avec un pointeur, il renverra la taille d'un pointeur, et non pas la taille de la chaîne, comme on le souhaiteriat. Pour cela, il vaut mieux utiliser strlen(), mais c'est une fonction qui a besoin que la chaîne soit terminée par un zéro binaire.

Reply

Marsh Posté le 14-04-2011 à 09:07:57    

Les boucles for(i=0;i<a+1;i++) et for(j=0;j<b+1;j++) sont fausses, si tu as a mots dans la chaine L1 il faut faire une boucle for(i=0;i<a;i++) , de même pour la seconde boucle.
D'autre part tu pourrais faire plus rapide en comparant directement les caractères au lieu de recopier et ensuite de comparer.
Pas de problème pour les sizeof (LL1 et LL2 sont des tableaux) et les fins de chaines, les cas sont bien gérés sauf pour l'init, je ferais plutôt char LL1[20]={0};  et char L2[20]= {0};
 
[EDIT]Grave erreur : tu ne dois pas utiliser l'indice i pour la recopie des mots de L1 ni l'indice j pour celui de L2.
i et j comptent les mots, il faut utiliser des indices spécifiques il1 et il2 qui parcourent les chaines L1 et L2
[/EDIT]

Message cité 1 fois
Message édité par Trap D le 14-04-2011 à 09:57:45
Reply

Marsh Posté le 15-04-2011 à 18:28:43    

Trap D a écrit :

Les boucles for(i=0;i<a+1;i++) et for(j=0;j<b+1;j++) sont fausses, si tu as a mots dans la chaine L1 il faut faire une boucle for(i=0;i<a;i++) , de même pour la seconde boucle.
D'autre part tu pourrais faire plus rapide en comparant directement les caractères au lieu de recopier et ensuite de comparer.
Pas de problème pour les sizeof (LL1 et LL2 sont des tableaux) et les fins de chaines, les cas sont bien gérés sauf pour l'init, je ferais plutôt char LL1[20]={0};  et char L2[20]= {0};
 
[EDIT]Grave erreur : tu ne dois pas utiliser l'indice i pour la recopie des mots de L1 ni l'indice j pour celui de L2.
i et j comptent les mots, il faut utiliser des indices spécifiques il1 et il2 qui parcourent les chaines L1 et L2
[/EDIT]


   
 
a propos des entiers passé en paramètres de fonction (int a,int b)sont les longueures de deux chaines respectivement L1 et L2 et n'est pas le nombre de mots dans la chaine.

Reply

Marsh Posté le 15-04-2011 à 18:58:54    

billgatesanonym a écrit :

1. Il est recommandé de toujours mettre un zéro binaire à la fin d'une chaîne de caractères. C'est notamment nécessaire quand on veut ensuite utiliser les fonctions strcmp(), strcpy(), etc.
Par exemple, ici, avant la ligne 25, il faudrait ajouter LL2[m] = '\0';
 
2. Attention à sizeof(). Si on l'utilise avec un pointeur, il renverra la taille d'un pointeur, et non pas la taille de la chaîne, comme on le souhaiteriat. Pour cela, il vaut mieux utiliser strlen(), mais c'est une fonction qui a besoin que la chaîne soit terminée par un zéro binaire.


 
merci de votre réponde
j'ai mis comme vous m'avez dit LL2[m] = '\0'; et j'ai remplacé le sizeof par strlen mais rien est changé.le calcule reste faux.
j'ai un petit souci,je pense que l'appel sucessive de fonction "compter_mot_identique" peut etre la cause.
 
dans le main j'appelle la fonction plusieurs fois et j'ajoute aussi que les chaine L1 et L2 passé en paramètre sont alloué dynamiquement dans le main.voila
 

Code :
  1. int main()
  2. {
  3. int compter_mot_identique(char*, char*,int ,int );
  4. int nb_foot=0,nb_cyclisme=0;
  5. char*ch1,*chaine;
  6. long lsize;
  7. int carac=0,i=0;
  8. char chemin[200];
  9. char repertoire[15]="D:\\dossier";
  10.    DIR *rep= NULL;
  11. struct dirent *fichierLu= NULL;
  12. ......
  13. .......
  14. foot = fopen("foot.txt", "r" );
  15.   if (NULL == foot)
  16.   {
  17.  printf("Impossible d'ouvrir le fichier de classe foot\n" );
  18.  return 1;
  19.   }
  20. fseek (foot, 0 , SEEK_END);  // Obtient la taille du fichier
  21. lsize = ftell (foot);
  22. rewind (foot);
  23. ch1 = (char*) malloc (lsize * sizeof(char));
  24. carac = fgetc(foot);
  25. while (carac != EOF)
  26.  {
  27.    while ( carac != ' ' && carac != '\n' && carac !=EOF ) // On continue tant que fgetc n'a pas retourné EOF (fin de fichier)
  28.     {
  29.      ch1[i]= carac;
  30.      i++;
  31.      carac = fgetc(foot);
  32.     }
  33.    ch1[i]=' ';
  34.   carac = fgetc(foot);
  35.   i++;
  36.  }
  37.   longueur1=strlen(ch1);
  38.   i=0;carac=0; lsize =0;
  39.   fclose (foot);
  40. ..
  41. ....
  42. ....
  43. rep =opendir(repertoire);
  44.   if (rep==NULL)
  45.   printf("erreur" );
  46.   fichierLu = readdir(rep);
  47. while( fichierLu!=NULL)
  48. {
  49.   if (strcmp(fichierLu->d_name, "." ) != 0 && strcmp(fichierLu->d_name, ".." ) != 0)
  50. {
  51.   sprintf(chemin, "%s\\%s", repertoire, fichierLu->d_name);
  52.   fichier = fopen(chemin,"r" );
  53.   if (NULL == fichier)
  54.   {
  55.  printf("Impossible d'ouvrir le fichier %s\n",fichierLu->d_name);
  56.  return 1;
  57.   }
  58.   fseek (fichier, 0 , SEEK_END);  // Obtient la taille du fichier
  59. lsize = ftell (fichier);
  60. rewind (fichier);
  61. chaine = (char*) malloc (lsize * sizeof(char));
  62. carac = fgetc(fichier);
  63. while (carac != EOF)
  64.  {
  65.    while ( carac != ' ' && carac != '\n' && carac !=EOF ) // On continue tant que fgetc n'a pas retourné EOF (fin de fichier)
  66.     {
  67.      chaine[i]= carac;
  68.      i++;
  69.      carac = fgetc(fichier);
  70.     }
  71.    chaine[i]=' ';
  72.   carac = fgetc(fichier);
  73.   i++;
  74.  }
  75.    longueur=strlen(chaine);;
  76.  
  77. //appel de la fonction
  78. nb_foot=compter_mot_identique(chaine,ch1,longueur,longueur1);
  79. fclose (fichier);
  80.   free(chaine);
  81. }
  82. fichierLu = readdir(rep);
  83. }
  84. free(ch1);
  85. if (closedir(rep)==-1)
  86. {
  87. printf("echec" );
  88. }
  89. return(0);
  90. }

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed