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 :

Comparer deux strings.


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 61
    Points : 43
    Points
    43
    Par défaut Comparer deux strings.
    Bonjour,

    J'ai des strings de même longueur que je veux comparer 2 à 2.
    Et avoir les caractères qui font qu'elles soient différentes.

    Je les ai déjà comparer ( je voies les quelles sont différents des autres) mais je ne sais pas comment récupérer les positions ou se trouvent les différences.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Exemple ( 4 strings de 20 chaines de caractères).
    string 1 : 01001101001101100101
    string 2 : 11011110110000101000
    string 3 : 11011011010010100000
    string 4 : 00111100101000111001
     
    string1 est différente de string2 à la position 1, 4 , 7 ect..
    Merci d'avance pour une idée.

  2. #2
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Points : 410
    Points
    410
    Par défaut
    Bonjour,

    Citation Envoyé par jamsgoodon Voir le message
    Je les ai déjà comparées
    Peux-tu nous donner ton code ?

    Citation Envoyé par jamsgoodon Voir le message
    Merci d'avance pour une idée.
    En voici une : je te propose d'utiliser des itérateurs.

    En voici une autre : je te propose de poser des questions de manière précise et détaillées, en expliquant notamment ce que tu as déjà fait et ce que tu n'arrives pas à faire, de façon à ce que la réponse aie un sens.
    Face à un post comme le tien, aujourd'hui, il n'y a qu'une seule réponse qui puisse t'aider : la solution complète.

    Or si des gens comme moi sont prêts et ont envie d'apporter leur contribution à l'apprentissage de gens qui en ont l'envie, ils n'ont en revanche pas du tout besoin (enfin j'espère), de refaire les exercices qu'ils ont déjà fait en classe quand ils étaient à ta place.

    J'espère que tu comprendras ce qu'une demande d'aide comme la tienne peut avoir de vexant pour quelqu'un qui passe du temps à essayer d'aider.

    Bonne journée

  3. #3
    Membre habitué

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2010
    Messages : 80
    Points : 127
    Points
    127
    Par défaut
    [EDIT] je rejoins ce que dis mon prédécesseur, mais là j'ai juste un peu de temps à perdre...

    sous quelle forme veux tu les résultats? Tu veux les stocker pour les réutiliser ensuite, ou juste récupérer les positions une par une, avant de faire un traitement?

    Dans le premier cas, renvoie par exemple une liste d'int initialement vide dans laquelle tu push_back les positions trouvées.

    Dans le deuxième, il n'y a rien de spécial à faire non?

    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
    int l = s1.length () ;
    int l2 = s2.length () ;
    if (l != l2)
        throw (taclasseexception("Les chaines à comparer ne sont pas égales !")) ;
     
    // premier cas
     
    std::list<int> res ;
    for (int i = 0 ; i < l ; ++i)
    {
        if (s1[i] != s2[i])
            res.push_back(i) ;
    }
     
    // deuxième cas : 
    for (int i = 0 ; i < l ; ++i)
    {
        if (s1[i] != s2[i]) {
            // ton traitement...
        }
    }

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 61
    Points : 43
    Points
    43
    Par défaut
    Bonjour,
    Après quelque jour de trêves sur le sujet je reviens sur la question.
    Merci regis pour le bout de code ça marche bien.

    J'ai écrit le résultat dans un fichier pour voir voir les différences relevées entre les sites mais :

    d'une part pour 2 chaines de caractères comparées, la première différence n'est pas prise en compte, je ne sait pas pourquoi?

    d'autre part je veux que le premier site soit le site 1 et non le site 0.

    en espérant avoir été clair!
    Merci d'avance.

    Voici le bout de code dans la fonction où la comparaison se fait.

    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
    37
     
     
        for( std::map<std::string, std::string>::iterator it1 = SitesDifferentsDonnes.begin(); it1 != SitesDifferentsDonnes.end(); ++it1){ //itterer sur Couple_De_Famille
     
     
               for(std::map<std::string, std::string>::iterator it1compare = SitesDifferentsDonnes.begin(); it1compare != SitesDifferentsDonnes.end(); ++it1compare){ //Itterer sur espece;
     
                int l = it1->second.length () ;
                int l2 = it1compare->second.length () ;
                if (l != l2)
                    throw ("Les chaines à comparer ne sont pas égales !") ;
     
                    std::ostringstream mespositions;
                    for (int i = 1 ; i < l ; ++i)
                    {
     
     
                        std::ostringstream GeneComparees;
     
                        if (it1->first != it1compare->first)
                        GeneComparees << it1->first << "_" << it1compare->first;
     
     
                            if (it1->second[i] != it1compare->second[i]) {
                            mespositions << " " <<i;
                            }
                            SitesDifferents [GeneComparees.str()] = mespositions.str() ;
     
                    }
     
                }
     
     
        }
        return(SitesDifferents);
     
    }

    L'appelle de la fonction se fait dans mon main.

    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
     
    std::map<string, std::string> SitesDifferents = DifferrenceEntreSeq(fichierOutG);
              std::cout << " La map courante SitesDifferents a " << SitesDifferents.size() << " elements" << std::endl;
     
                    int copt=1;
                    for(map<std::string, std::string>::iterator it1 =  SitesDifferents.begin(); it1!=  SitesDifferents.end(); ++it1){
     
                             FileSitesDifferents  << it1->first<< " ";
                             FileSitesDifferents  << it1->second <<'\n';
     
     
                        }
                        copt++;
     
              cout << "terminer" << endl;

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 61
    Points : 43
    Points
    43
    Par défaut Problème résolu!!
    Merci j'ai pu résoudre le problème.

    D'une part Il fallait initialiser le "i" du for à 0
    et
    d'autre part ne pas stocker "i" mais plutôt "i+1".

    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
    37
     
     
        for( std::map<std::string, std::string>::iterator it1 = SitesDifferentsDonnes.begin(); it1 != SitesDifferentsDonnes.end(); ++it1){ //itterer sur Couple_De_Famille
     
     
               for(std::map<std::string, std::string>::iterator it1compare = SitesDifferentsDonnes.begin(); it1compare != SitesDifferentsDonnes.end(); ++it1compare){ //Itterer sur espece;
     
                int l = it1->second.length () ;
                int l2 = it1compare->second.length () ;
                if (l != l2)
                    throw ("Les chaines à comparer ne sont pas égales !") ;
     
                    std::ostringstream mespositions;
                    for (int i = 0 ; i <l; ++i)
                    {
     
     
                        std::ostringstream GeneComparees;
     
                        if (it1->first != it1compare->first)
                        GeneComparees << it1->first << "_" << it1compare->first;
     
     
                            if (it1->second[i] != it1compare->second[i]) {
                            mespositions << " " <<i+1;
                            }
                            SitesDifferents [GeneComparees.str()] = mespositions.str() ;
     
                    }
     
                }
     
     
        }
        return(SitesDifferents);
     
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 20/02/2014, 17h16
  2. comparer deux string
    Par dingua dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 06/12/2009, 14h29
  3. [Débutant] Comparer deux strings
    Par madaou dans le forum Pascal
    Réponses: 6
    Dernier message: 25/12/2008, 22h06
  4. comparer deux chaines ansistrin ou string .
    Par supersoft5 dans le forum C++Builder
    Réponses: 6
    Dernier message: 24/05/2007, 15h02
  5. comparer deux string
    Par jul54 dans le forum MFC
    Réponses: 3
    Dernier message: 22/04/2004, 16h50

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