Bonjour,
Avez vous une idée de la fonction qui cherche l'existence ou le nombre d'occurence d'un mot dans une phrase ( ou texte entière) dans C ?
Bonjour,
Avez vous une idée de la fonction qui cherche l'existence ou le nombre d'occurence d'un mot dans une phrase ( ou texte entière) dans C ?
S'il te faut juste produire l'expression régulière correspondante, tu peux te référer à wiki:
http://fr.wikipedia.org/wiki/Express...lle#Exemples_2
EDIT: suite au edit du message originnel par l'auteur, je laisse quand même ce que j'ai dit. Même si le but recherché n'est plus une expression régulière mais la fonction C correspondante, le wiki en question est quand même bien =)
Sans te donner le code complet (c'est un exercice donc à toi de le faire), l'idée est de comparer caractère par caractère ta chaîne et ton texte, et cela en déplaçant le début de la comparaison et en stockant les résultats au fur et a mesure.
Si le prof ne l'interdit pas tu peux utiliser :
#include<string.h>
int strncmp(const char *, const char *, size_t);
Pour trouver les occurrences (i.e. trouver une sous-chaîne dans une chaîne), il faut plutôt utiliser la fonction strstr.
Pour les compter, on peut s'en servir au sein d'une boucle, en utilisant un compteur.
Effectivement mais ca pose un probleme : cette fonction recherche la premiere occurence, mais revoie un pointeur. Il faudrait donc remprendre la recherche de l'occurence suivante en reutilisant ce pointeur pour recreer une nouvelle chaine et la repasser en parametre à la fonction, c'est faisable mais pas forcement le plus simple a comprendre pour un debutant.
Je suis pourtant du même avis que jeroman. La seule différence entre sa solution et la tienne, c'est que tu proposes de réécrire strstr au lieu de directement l'utiliser (ou, plutôt, tu proposes d'écrire une version non réutilisable de strstr).
Un petit coup de pouce, ça me rappèlera les bon vieux cours de c!
Pointeur de lettre dans ton expression (l'@ de départ de ta chaine)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 /* faisons simple... */ char chaine[200]; char *ptr = null; /* Tu connais la taille de ta phrase en char. Tu peux simplement allouer un autre tableau de char pour contenir l'expression à rechercher, exemple, ici "on": */ char expression[] = {"on"}; char tmpexpr [10]; int cpt = 0; // un compteur int i,j; for (i=0; i<strlen(chaine); i++) { /* ptr | v __________________________ |B|o|n|j|o|u|r| |m|o|n|d|e|!| ------------------------------ */ ptr = chaine + i*sizeof(char); /* tu te déplaces successivement de 1 (caractère!) jusqu'à la fin */ for (j=0; j<strlen(expression); j++) tmpexpr[j] = ptr + j*sizeof(char); 'Bo', 'on', 'nj' ... if (!strcmp(expression, tmpexpression) // si ocurence trouvée, cpt++; }
C'était juste une piste,
bon courage
Aucune chaine n'est recréée, ce n'est qu'un pointeur qui pointe simplement ailleurs dans la chaine.Effectivement mais ca pose un probleme : cette fonction recherche la premiere occurence, mais revoie un pointeur. Il faudrait donc remprendre la recherche de l'occurence suivante en reutilisant ce pointeur pour recreer une nouvelle chaine et la repasser en parametre à la fonction, c'est faisable mais pas forcement le plus simple a comprendre pour un debutant.
Pour un débutant, utiliser strstr est plus simple... que récrire la fonction.
Une fois la première occurrence trouvée, on additionne la valeur du pointeur avec strlen(souschaine). Et hop, on recommence... jusqu'à ce que strstr renvoie NULL.
On peut donc très simplement trouver, grâce à une boucle très simple, toutes les occurrences et même les compter en utilisant un compteur (une variable, initialisée à 0, dont on incrémentera la valeur à chaque occurrence trouvée).
Le problème avec strncmp c'est que, comme Melem le souligne, cela oblige à parcourir soi-même la chaîne à la recherche de la sous-chaîne, et donc d'une certaine manière à réécrire l'équivalent de strstr... sachant que pour un débutant c'est, AMHA, justement plus facile d'utiliser une fonction déjà existante que de la recréer.
D'autant que là aussi il faut utiliser un pointeur, car il faut se déplacer dans la chaine (à moins d'utiliser une syntaxe du style &chaine[position] pour se passer de pointeur).
Avec strcmp, ça ne marchera pas. L'histoire du '\0' de fin de chaine et de sous-chaine posera un problème : la fonction renvoie 0 uniquement si les deux chaînes sont strictement identiques ('\0' final compris). Or, si on cherche une sous-chaine à l'intérieur d'une chaine, le '\0' final de la chaine ne sera pas trouvé (sauf carrément à la fin) et aucune occurrence ne sera trouvée...
Ah oui effectivement, ça marchera pas.Avec strcmp, ça ne marchera pas. L'histoire du '\0' de fin de chaine et de sous-chaine posera un problème : la fonction renvoie 0 uniquement si les deux chaînes sont strictement identiques ('\0' final compris). Or, si on cherche une sous-chaine à l'intérieur d'une chaine, le '\0' final de la chaine ne sera pas trouvé (sauf carrément à la fin) et aucune occurrence ne sera trouvée...
Essaye d'utiliser strstr() comme jeroman l'a indiqué.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager