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 les occurrences d'une chaine dans une autre


Sujet :

C

  1. #1
    En attente de confirmation mail
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 9
    Points : 13
    Points
    13
    Par défaut Compter les occurrences d'une chaine dans une autre
    Bonjour,

    Je cherche à réaliser une fonction qui prend deux paramètres, deux chaines de caractères. L'une désigne ce que l'on cherche (et il peut y avoir des wildcard, par exemple *.c) et l'autre la chaine dans laquelle on cherche (par exemple test.c).

    Le but de la fonction est de savoir combien de fois la chaine recherchée est matchée dans le string.
    Par exemple si on cherche "a**" dans "abc" , c'est matché trois fois :
    La première * peut désigner rien, b, ou bc
    La seconde * peut respectivement désigner bc, c ou rien.

    Je n'ai pas de problèmes pour savoir si une chaine match avec une autre, mais pour compter les combinaisons possibles, je sèche.

    Auriez vous des idées de comment implémenter cela ? J'aimerai poser une question plus précise, mais je ne sais vraiment pas par où commencer

    Merci

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 395
    Points : 23 756
    Points
    23 756
    Par défaut
    Bonjour,

    Citation Envoyé par Algo75 Voir le message
    Je cherche à réaliser une fonction qui prend deux paramètres, deux chaines de caractères. L'une désigne ce que l'on cherche (et il peut y avoir des wildcard, par exemple *.c) et l'autre la chaine dans laquelle on cherche (par exemple test.c).
    Soit c'est pour l'exercice et tu peux réaliser tes propres fonctions, soit c'est une fonction nécessaire pour la suite d'un projet plus grand et, dans ce cas, tourne-toi plutôt vers les globales et les expressions régulières qui ont été étudiées depuis longtemps et qui prennent déjà en charge les cas de figure subtils qui ne sautent pas forcément aux yeux dès le départ.

    Je n'ai pas de problèmes pour savoir si une chaine match avec une autre, mais pour compter les combinaisons possibles, je sèche.
    Il faut d'abord déterminer une chose : si les motifs se chevauchent, est-ce que tu veux réellement recenser tous les cas possibles ou passer directement à la suite ? Par exemple, si je recherche « aaa » dans la chaîne « aaaaaa », j'ai deux façons de voir les choses :

    Cas 1 : on cherche les motifs consécutifs.
    Deux solutions possibles :
    aaaaaa
    Cas 2 : on cherche les motifs qui se chevauchent éventuellement.
    Quatre solutions possibles :
    aaaaaa
    aaaaaa
    aaaaaa
    aaaaaa
    Dans le dernier cas, le procédé reste fort simple, il suffit de lancer la recherche à partir du début de la chaîne, puis à partir du caractère suivant, puis à nouveau du suivant, et ainsi de suite jusqu'à la fin de la chaîne, indépendamment des résultats trouvés. Cela dit, avec des expressions complexes, spécialement celles qui contiennent des OU « | », il est possible de manquer des correspondances si on s'arrête à la première correspondance trouvée et que l'on ne vérifie pas la validité des autres motifs.

  3. #3
    Membre actif Avatar de moins1
    Homme Profil pro
    Autre
    Inscrit en
    Février 2013
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Autre
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 85
    Points : 222
    Points
    222
    Par défaut
    J'ai un peu de mal à comprendre la signification de ton "wildcar" *. Si t'en mets un, il peut remplacer rien, un caractère ou 2 caractères, alors pourquoi en mettre 2 dans ton exemple?

    Si tu cherche "a**" dans "qwertyasdfgzxcvbs" ça va donner quoi?


  4. #4
    En attente de confirmation mail
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 9
    Points : 13
    Points
    13
    Par défaut
    Bonjour,

    Merci de vos réponses.
    J'ai finalement ré implémenté ma fonction permettant de savoir si une chaine matche avec une autre ou non et l'ai fait en récursive. Je pense que que grâce à ça je n'aurai pas de mal à ajouter un compteur et que ca devrait plus oumoins faire ce que je cherche, je n'ai pas encore eu le temps d'essayer. Je reviendrais en cas de problèmes mais je pense mon problème résolu.

    Sinon c'était bien pour l'exercice.
    Et le wildcard peut remplacer rien, un caractère ou plus. En mettre deux pour l'exemple : pour l'exercice. Si je cherche a** dans ta chaine, ca ne matchera pas car ca ne commence pas par a.

  5. #5
    Membre du Club
    Homme Profil pro
    Administrateur Système Linux.
    Inscrit en
    Décembre 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur Système Linux.

    Informations forums :
    Inscription : Décembre 2012
    Messages : 21
    Points : 58
    Points
    58
    Par défaut
    Bonjour.

    Sinon il existe aussi une fonction strstr() qui te permet de checker si une chaine est présente dans une autre chaine.
    Code Prototype : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    strstr(const char *s1, const char *s2);

    Voici un bout de code pour te montrer l'implémentation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include <stdio.h>
    #include <string.h>
     
    void main() {
        printf("Recherche de Abc dans AbcDef %s. \n"), (strstr("AbcDef, Abc")) ? "Trouvé": "Non trouvé!");
        return 0;
    }
    Ce qui m'amène a te parler de strstr_cnt().

    Code Prototype : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int strstr_cnt(const cahr *s1, const char *s2);

    voici un bout de code qui pourra t'aider surement:
    Code exemple : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int strstr_cnt(const char *chain, const char *fragment) {
        int i, j, k, compteur = 0;
     
        for (i=0; chaine[i]; i++)
            for (j = i, k =0; chaine[j] == fragment[k]; j++, k++)
                if (! fragment[k + 1])
                    compteur++;
        return(compteur);
    }

    0x90_

Discussions similaires

  1. remplacer les occurences d'un caractere dans une chaine par un autre
    Par lity7 dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 14/03/2008, 12h02
  2. Tester une chaine dans une chaine
    Par ulysse031 dans le forum Algorithmes et structures de données
    Réponses: 13
    Dernier message: 26/03/2007, 00h48
  3. chercher caractére d'une chaine dans une chaine
    Par ulysse031 dans le forum Langage
    Réponses: 25
    Dernier message: 21/03/2007, 18h09
  4. Compter les occurences d'un car dans une chaine/variable
    Par sherlockfr dans le forum Windows
    Réponses: 2
    Dernier message: 10/11/2005, 07h48
  5. Réponses: 2
    Dernier message: 19/10/2005, 15h38

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