Bonjour, j'essaye de compter le nombre de mots qu'il y a dans une chaîne.
Il y a t'il un moyen efficace? Car moi tout ce que j'ai en tête comme algorithme c'est rechercher des " " et a chaque fois que jen trouve un j'incrémente.
Autre moyens? Merci.
Bonjour, j'essaye de compter le nombre de mots qu'il y a dans une chaîne.
Il y a t'il un moyen efficace? Car moi tout ce que j'ai en tête comme algorithme c'est rechercher des " " et a chaque fois que jen trouve un j'incrémente.
Autre moyens? Merci.
Hehe! Ouais je l'ai fait de cette facon merci.
Ya pas d'algo déja disponible cependant?
Si tu cherches un algo pour un petit problème de ce genre, tu vas avoir du mal par la suite. Il existe surement des petits algos de ce genre disponibles sur le net (notamment sur les pages de cours de profs de facs par exemples).
Google est ton ami :
![]()
Salut,
il n'y a pas d'autre algorithme, c'est le plus trivial, il fonctionne trés bien, si tu cherches des mots au sens dictionnaire du terme.
S'il s'agit de mots reservés d'un langages, ça se complique car en plus de ' ', il faut ajouter tous les séparateurs du langage.
Il faut simplement définir les séparateurs, il n'y a pas que l'espace, la tabulation les virgules, point virgules etc
"La haine seule fait des choix" - Koan Zen
"Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
"Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
Faites du Prolog, ça vous changera les idées !
Ma page Prolog
Mes codes sources commentés
Mon avatar : La Madeleine à la veilleuse de Georges de La Tour
Attention si deux espaces se suivent à ne pas compter un mot en trop. Avec std::string et find c'est pas trop dur à faire. Ca dépend de ce que tu considères comme séparateur. Si c'est juste l'espace, y'a peut être une option plus simple avec istringstream.
Mais niveau performance ça doit pas être top (car les mots sont extraits).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 string s = "mot1 mot2 mot3"; istringstream iss( s ); string tmp; int nb = 0; while ( iss >> tmp ) { ++nb; }
Voire même
Ou encore, pour plus de flexibilité sur les séparateurs
Code : Sélectionner tout - Visualiser dans une fenêtre à part int Nb = std::count(s.begin(), s.end(), ' ') + 1;
Seul défaut : il ne faut pas avoir plusieurs séparateurs entre 2 mots. Au pire on peut faire un std::unique avant pour palier à ça.
Code : Sélectionner tout - Visualiser dans une fenêtre à part int Nb = std::count_if(s.begin(), s.end(), isspace) + 1;
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
Et si la chaine est vide ?![]()
et si la chaine ne comporte pas de mots mais des caracteres bizzares ?
+ + + - - - 8 + 8 4 6
ne contient aucun mot, mais ton prog va sortir :
11 mots trouvés...
Ben oui tout est là : il faut définir précisément ce qu'est un mot...
Il n'y a pas de solutions simples en C++, vous m'étonnez, en C on parcourt la chaîne avec un petit test avec isalpha(c) et tout va bien![]()
Y'en a pour dix lignes de code compréhensible.
"La haine seule fait des choix" - Koan Zen
"Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
"Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
Faites du Prolog, ça vous changera les idées !
Ma page Prolog
Mes codes sources commentés
Mon avatar : La Madeleine à la veilleuse de Georges de La Tour
pfff
rien a voir avec c ou c++. c un probleme d'algo.
Le tout c de savoir ce qu'est un mot :
tout caractere autre que 0x20h ou alors tout ensemble de caracateres alpha-numeriques incluant le - de plus de 2 de longueur, par exemple.








la fonction strtok de string.h fera tres bien le travaille
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 char str[]="bonjour a tous mes amis"; char*mot; int nbr=0; mot=strtok(str," \n\r\0"); while (mot) { nbr++; mot=strtok(NULL," /n/r/0"); } cout<<nbr<<endl;
Envoyé par Trap D
Ben là c'est exactement la même chose (en (beaucoup) plus long) que mon std::count_if, qui ne tient lui que sur une ligne...Envoyé par philippe V
On ajoute un test, on renvoie zéro si s.empty() par exempleEnvoyé par Aurelien.Regat-Barrel
D'après notre ami xVINCEx ce sont juste des séquences de caractères séparées par des espaces.Envoyé par Aurelien.Regat-Barrel
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
Moi je ne parlais pas de strtok, mais d'un petit automate, qui renvoie un mot, cet automate parcourant la chaîne, et dés que le début d'un mot est repéré (par isalpha(c)), le fourni entier au programme appelant et ainsi de suite.
Ai-je été clair ?![]()
"La haine seule fait des choix" - Koan Zen
"Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
"Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
Faites du Prolog, ça vous changera les idées !
Ma page Prolog
Mes codes sources commentés
Mon avatar : La Madeleine à la veilleuse de Georges de La Tour








philippe V a écrit:
la fonction strtok de string.h fera tres bien le travaille
Ben là c'est exactement la même chose (en (beaucoup) plus long) que mon std::count_if, qui ne tient lui que sur une ligne...
bien pas exacetment
dans le cas ou plusieur espace ce suive std::count() considera chaque espase tandisque strtok() vas considerer le contenu de la valeur retourne
ainsi les chaines
strtok() retournera 5 mots pout s1 et 5 mots pour s2
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 s1=Bonjour a tous mes ami s2=Boujour a tous mes ami
tandisque
std::count retournera 5 mots pour s1 et 9 mots pout s2
Dans ce cas on préférera quand même y aller à coup de string::find_first_of par exemple, pour compter le nombre de mots.
Le C++ c'est toujours mieux
(PS pour les pinailleurs : cette affirmation est bien sur fausse)
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.








Bien Sure
on peut ce debroullier avec string::find_first_of et string::substr()
mais bon!!!!
La baute du C++ ces qu'on a les tout aquis du C + le stream + template![]()
Ok voici la situation.
En effet j'ai apprit aujourd'hui que si exemple jai:
string test = "voici une ? phrase"
je veux retourner le fait qu'il y ait 3 mots la dedans et non 4
il y a les fonctions isspace et ispunct qui serait utile mais la je suis tout mélangé :/
Partager