IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Compter nombre de mots dans une chaîne.


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 52
    Points : 34
    Points
    34
    Par défaut Compter nombre de mots dans une chaîne.
    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.

  2. #2
    Membre actif Avatar de Nicodemus
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 242
    Points : 212
    Points
    212
    Par défaut
    Tu l'as ta solution .

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 52
    Points : 34
    Points
    34
    Par défaut
    Hehe! Ouais je l'ai fait de cette facon merci.
    Ya pas d'algo déja disponible cependant?

  4. #4
    Membre actif Avatar de Nicodemus
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 242
    Points : 212
    Points
    212
    Par défaut
    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 :

  5. #5
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    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.

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    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

  7. #7
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 682
    Points
    10 682
    Billets dans le blog
    3
    Par défaut
    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.
    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; }
    Mais niveau performance ça doit pas être top (car les mots sont extraits).

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Voire même

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int Nb = std::count(s.begin(), s.end(), ' ') + 1;
    Ou encore, pour plus de flexibilité sur les séparateurs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int Nb = std::count_if(s.begin(), s.end(), isspace) + 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.

  9. #9
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 682
    Points
    10 682
    Billets dans le blog
    3
    Par défaut
    Et si la chaine est vide ?

  10. #10
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 150
    Points : 180
    Points
    180
    Par défaut
    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...

  11. #11
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 682
    Points
    10 682
    Billets dans le blog
    3
    Par défaut
    Ben oui tout est là : il faut définir précisément ce qu'est un mot...

  12. #12
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    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

  13. #13
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 150
    Points : 180
    Points
    180
    Par défaut
    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.

  14. #14
    Membre habitué
    Inscrit en
    Avril 2002
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 180
    Points : 157
    Points
    157
    Par défaut
    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;

  15. #15
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par Trap D
    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.
    Citation Envoyé par philippe V
    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...

    Citation Envoyé par Aurelien.Regat-Barrel
    Et si la chaine est vide ?
    On ajoute un test, on renvoie zéro si s.empty() par exemple

    Citation Envoyé par Aurelien.Regat-Barrel
    Ben oui tout est là : il faut définir précisément ce qu'est un mot...
    D'après notre ami xVINCEx ce sont juste des séquences de caractères séparées par des espaces.

  16. #16
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    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

  17. #17
    Membre habitué
    Inscrit en
    Avril 2002
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 180
    Points : 157
    Points
    157
    Par défaut
    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
    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
    strtok() retournera 5 mots pout s1 et 5 mots pour s2
    tandisque
    std::count retournera 5 mots pour s1 et 9 mots pout s2

  18. #18
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    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)

  19. #19
    Membre habitué
    Inscrit en
    Avril 2002
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 180
    Points : 157
    Points
    157
    Par défaut
    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

  20. #20
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 52
    Points : 34
    Points
    34
    Par défaut
    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é :/

Discussions similaires

  1. Compter nombre de mots dans une cellule Excel
    Par nkhalidy dans le forum Excel
    Réponses: 6
    Dernier message: 12/07/2017, 21h12
  2. Nombre de mots dans une chaîne de caractères
    Par Gamuelf dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 06/02/2013, 12h13
  3. Compter nombre de 0 dans une chaîne
    Par tibss dans le forum SAS Base
    Réponses: 3
    Dernier message: 14/10/2009, 10h45
  4. compter le nombre de mot dans une ligne fichier sous shell
    Par ninsekh dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 18/12/2008, 17h54
  5. Compter les occurences d'un mot dans une chaîne
    Par mimi2311 dans le forum Pascal
    Réponses: 4
    Dernier message: 20/04/2008, 22h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo