Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1157 connectés 

  FORUM HardWare.fr
  Programmation
  C

   fonction compter mot identique entre deux chaines

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

fonction compter mot identique entre deux chaines

n°2069802
narjes86
Posté le 13-04-2011 à 18:11:06  profilanswer
 

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.

mood
Publicité
Posté le 13-04-2011 à 18:11:06  profilanswer
 

n°2069820
billgatesa​nonym
Posté le 13-04-2011 à 21:52:14  profilanswer
 

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.

n°2069856
Trap D
Posté le 14-04-2011 à 09:07:57  profilanswer
 

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
n°2070364
narjes86
Posté le 15-04-2011 à 18:28:43  profilanswer
 

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.

n°2070372
narjes86
Posté le 15-04-2011 à 18:58:54  profilanswer
 

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. }


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

   fonction compter mot identique entre deux chaines

 

Sujets relatifs
Avoir la fonction "Sum" par défaut dans la table pivotcompter l'occurrence d'un mot dans un fichier xml
Macro excel en fonction d'un choix dans le classeurfonction find vba
Probleme fonction SWITCH SQL ACCESSVariable PHP dans une fonction Javascript
Plus de sujets relatifs à : fonction compter mot identique entre deux chaines


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR