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.
Version imprimable
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.
Tu l'as ta solution :wink:.
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).
:recherch: Google est ton ami : :google:
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
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:
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 :DCode: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:int Nb = std::count_if(s.begin(), s.end(), isspace) + 1;
Et si la chaine est vide ? :D
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 :lol:
Y'en a pour dix lignes de code compréhensible.
:evilred: 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:
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;
Citation:
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... :roll:Citation:
Envoyé par philippe V
On ajoute un test, on renvoie zéro si s.empty() par exemple :langue:Citation:
Envoyé 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.Citation:
Envoyé par Aurelien.Regat-Barrel
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 ? :oops:
Citation:
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 s2Code:
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 :wink:
(PS pour les pinailleurs : cette affirmation est bien sur fausse)
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 :wink:
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é :/