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 chaines de char.


Sujet :

C++

  1. #1
    Membre très actif
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Août 2010
    Messages : 130
    Par défaut Comparer deux chaines de char.
    Bonjour,
    Pour comparer 2 chaînes, il ne faut pas utiliser l'opérateur == . Pourquoi ?
    (Je sais que la fonction compare() fait la job mais je veux juste comprendre)

    p.s. j'aimerais comprendre comment marche 1 == 1 au niveau binaire mais aucune idée d'ou trouver ca. ( un livre aussi pas forcément sur internet)

    Merci de m'aider.

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Citation Envoyé par naskaa Voir le message
    Pour comparer 2 chaînes, il ne faut pas utiliser l'opérateur == . Pourquoi ?
    Si tu fais du C++ et que tu utilises std::string pour des chaînes de caractères, alors tu peux très bien utiliser l'opérateur == pour comparer des chaînes de caractères :
    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
    #include <string>
    #include <iostream>
     
    void test_difference(std::string const &s1_, std::string const &s2_)
    {
       std::cout<<"\""<<s1_<<"\" et \""<<s2_<<"\" sont ";
       if(s1_==s2_)
       {
          std::cout<<"identiques\n";
       }
       else
       {
          std::cout<<"differentes\n";
       }
    }
     
    int main()
    {
       test_difference("un","deux");
       test_difference("idem","idem");
       std::cout<<std::boolalpha<<(std::string("un")==std::string("deux"))<<"\n";
       std::cout<<std::boolalpha<<(std::string("un")==std::string("un"))<<"\n";
     
       return 0;
    }
    Il ne faut donc pas utiliser char const * pour les chaînes de caractères car la comparaison avec l'opérateur == se fait alors sur l'adresse et non sur les valeurs pointées par l'adresse. Il faut faire attention avec les chaînes de caractères littérales dans le code qui sont par défaut en char const * et qui peuvent avoir des comportements différents selon les compilateurs et leurs options : les chaînes identiques peuvent être factorisées ou pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <iostream>
    int main()
    {
       const char* un="un";
       const char deux[]="un";
       const char *trois = "un";
       std::cout<<std::boolalpha<<(un==deux)<<"\n";
       std::cout<<std::boolalpha<<(un==trois)<<"\n";
       std::cout<<std::boolalpha<<("un"=="un")<<"\n";
       return 0;
    }
    préférez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <iostream>
    #include <string>
    int main()
    {
       std::string un="un";
       std::string deux="un";
       std::string trois = "un";
       std::cout<<std::boolalpha<<(un==deux)<<"\n";
       std::cout<<std::boolalpha<<(un==trois)<<"\n";
       std::cout<<std::boolalpha<<(std::string("un")==std::string("un"))<<"\n";
       return 0;
    }
    Citation Envoyé par naskaa Voir le message
    p.s. j'aimerais comprendre comment marche 1 == 1 au niveau binaire mais aucune idée d'ou trouver ca.
    qu'entends-tu par 'au niveau binaire' car ça n'a pas vraiment de sens
    Les microproc ont des commandes permettant la comparaison (cmp ou test pour x86 il me semble). J'en suis resté à les comparaisons s'appuient sur la soustraction et regardent les registres (bit de signe, bit zéro) pour en déduire le résultat mais je ne suis pas expert ASM. (et test s'appuierait lui sur and et non la soustraction).

  3. #3
    Membre très actif
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Août 2010
    Messages : 130
    Par défaut
    Si je comprends bien
    const char* test="un";
    Donc (test) va contenir l'adresse du premier char de la chaine de charactere "un". Et si je fais un compare entre une string (test2) et cette variable (test) qui est de type const char *. Il va me comparer le contenu de (test) qui est une adresse avec la string (test2). Ce qui fausse la comparaison.
    Et pour la comparaison il fait une soustraction au niveau binaire.

    Donc je présume que si j'ai une string* test3 = new string("test3");
    le même problème se pose car (test3) est un pointeur qui contient une adresse et si je le compare avec (test2), ca ne marchera pas ?

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Citation Envoyé par naskaa Voir le message
    Donc je présume que si j'ai une string* test3 = new string("test3");
    le même problème se pose car (test3) est un pointeur qui contient une adresse et si je le compare avec (test2), ca ne marchera pas ?
    Exact. C'est pour ça que string est conçue pour être utilisée par valeur et pas par pointeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::string un("un");
    std::string deux("deux");
    std::string one("un");
    assert((un==deux)==false);
    assert((un==one)==true);

  5. #5
    Membre très actif
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Août 2010
    Messages : 130
    Par défaut
    ok ok merci ca aide !


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

Discussions similaires

  1. Comparer deux chaines
    Par gferrier dans le forum Langage
    Réponses: 1
    Dernier message: 21/03/2007, 15h43
  2. Comparer deux chaines
    Par ponpon17430 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/09/2006, 23h20
  3. Réponses: 4
    Dernier message: 08/09/2006, 09h41
  4. Comparer deux chaines de caractères dans un if ?
    Par Xplosif² dans le forum C++
    Réponses: 6
    Dernier message: 25/02/2006, 19h21
  5. comparer deux chaines de caractères
    Par peuf23 dans le forum Langage
    Réponses: 3
    Dernier message: 30/01/2006, 14h31

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