Programme en c qui compte le nombre d'occurence d'un mot

[Fermé]
Signaler
Messages postés
34
Date d'inscription
mercredi 3 septembre 2014
Statut
Membre
Dernière intervention
30 mars 2015
-
Messages postés
5583
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
9 juillet 2021
-
bonjour alor voila mon problemme j'ai envie faire un programme qui verifie le nombre d'apartion d'un mot dans un fichie texte ligne par ligne j'ai donc utiliser la fonction fgets et strtok et strcmp voila mon code
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct
{
 int taille;
 int numligne;
 int nbrocc; 
 int nbroccp;
} mot;

 
main()
{
int n;
int d;
int k;
int s;
int p;
mot A;
int i;
i=0;
j=0;
s=0;
k=0;
char ch[100];
char sh[100];
printf("taper le nombre de ligne par page\n");
scanf("%d",&n);
printf("taper le  le mot que vous recherchez dans le fichie texte\n");
scanf("%s",&sh);
FILE *f;
A.nbrocc=0;
A.nbroccp=0;
f=fopen("testetp.txt","a+"); 
while (fgets(ch, 100, f) != NULL)
{
char *word=strtok(ch," ?!:.,\0 ");
while(word!=NULL){
    if(strcmp(sh,word)==0)
    {A.nbrocc++;
    }
 word=strtok(NULL," ?!:.,\0 ");
}i++;
k=A.nbrocc;
k=k-s;
s=A.nbrocc;
printf("le mot %s apparait %d fois dans la ligne %d\n",sh,k,i);
}
A.taille=strlen(sh);
printf("\nle nombre de ligne est = %d\n",i);
printf("le nombre d'occurence du mot  est = %d\n",A.nbrocc);
printf("la taille du mot est = %d\n",A.taille);
d=ceil((float )i/n);
printf("le nombre de page est = %d\n",d);
fclose(f);
return 0;
}

desole c mal ordone et y'a des declaration inutile
mon problemme est que le derinier mot de chaque ligne lorsqu'il n'est pas suivi par un blanc un point ou virgule..
n'est pas comptabilise dans le nombre d'occurence et pourtant j'ai mis \0(caractere saut de ligne) dans le strtok merci de votre aide
je precise aussi que le dernie mot du fichie texte lui est comptabilise

2 réponses

Messages postés
5583
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
9 juillet 2021
944
Salut akademia,

Ton code de compile pas.

Quand bien même il compilerait, on n'a pas de jeu de données pour le tester et observer le comportement que tu indiques.

Il ne peut pas fonctionner avec n'importe quel texte, car les lignes n'ont pas nécessairement une taille inférieure à 99 (il se peut donc que tu lises un mot à moitié), et tes caractères séparateurs ne sont pas exhaustifs par rapport à ceux pouvant être utilisés dans la langue française.

Mettre '\0' n'a pas de sens dans strtok, car c'est le caractère qui termine une chaîne.

Le caractère qui permet d'aller à la ligne est '\n'.

Dal

N.B. : ton code est également illisible car tu n'utilises pas les balises de <code c> permettant de préserver l'indentation de ton code, de colorer la syntaxe et numéroter tes lignes.

si tu n'as pas vu le bouton de l'éditeur te permettant de le faire, vois ce lien pour être guidé sur cette question, et à l'avenir poste ton code correctement stp
Messages postés
34
Date d'inscription
mercredi 3 septembre 2014
Statut
Membre
Dernière intervention
30 mars 2015

merci ca a marche effectivement lorsque j'enleve \0 je ne sais pas pour vous mais pour moi il compile normalement maintenant il me donne les ocurence des mot en fin de chaine et pour la taille max des chaine elle est limite a 99 par l'exercise
le fichie texte ne comporte au max que 99 caractere par lignes
et j'ai une autre question j'utilise le dev c++ j'ai remarquer qu'il ne comptabilise pas les mot quand je donne un mot avec un accent (un é par exemple)comment y remedier ? et aussi que la fonction fgets ne renvoie pas un \0 en fin de chaine ou elle renvoie juste un \n ? merci de votre aide( je suis au courant pour les balise de code c encore une fois desole pour ce code )
Messages postés
34
Date d'inscription
mercredi 3 septembre 2014
Statut
Membre
Dernière intervention
30 mars 2015

je vien aussi de remarquer que ca ne comptabilise pas les mot avec une apostrophe
Messages postés
34
Date d'inscription
mercredi 3 septembre 2014
Statut
Membre
Dernière intervention
30 mars 2015

merci de votre aide
Messages postés
5583
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
9 juillet 2021
944
Salut akademia,

Poste ton code corrigé (avec les balises <code c>), avec un jeu de données de test illustrant ton problème (avec balise <code>, et précise le résultat que tu obtiens et le résultat que tu devrais obtenir.

Dal