Double comparaison de std string

Résolu
cedric -  
KX Messages postés 19031 Statut Modérateur -
Bonjour,

je voudrais savoir comment coder une double comparaison en C/C++ sur des std string

Si A ou B est vide, je ne rentre pas dans le if

std::string A , std::string B
if ((CNX_A.empty() != 0) || (CNX_B.empty() != 0))

merci d'avance,
cedric

3 réponses

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    Regarde la documentation de std::string et en particulier std::string::empty()

    if (!A.empty() && !B.empty()) 
    { 
       // ... 
    }
    La confiance n'exclut pas le contrôle
    1
  2. Heremion Messages postés 564 Statut Membre 102
     
    Bonjour Cedric,

    Pour ne pas rentrer dans ton if, tes deux string doivent être remplis visiblement. Plutôt que de dire
    si(non_vide(A)) ou (non_vide(B)) 
    , pourquoi ne pas faire le test,
    si(remplis(A et B))
    ?

    un truc du genre :

    if ((A.size() > 0) && (B.size() > 0)) then
    //
    else
    //

    0
  3. cedric
     
    KX,
    ca marche !

    if ((CNX_A != "") && (CNX_B != ""))
    {
    //
    }
    Merci.
    0
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      L'opérateur != n'est pas défini dans std::string, et si parfois ça marche, l'utiliser peux t'amener à des erreurs. c'est pour cela qu'il existe la méthode std::string::compare mais qui est de toute façon beaucoup plus lourde en nombre d'opérations qu'utiliser directement std::string::empty :

      Regarde pour comparer les deux implémentations (un peu simplifiées) de empty et compare :

      bool empty() const 
      { 
          return (_Mysize == 0); 
      } 
      
      int compare(size_type _Off, size_type _N0, const _Elem *_Ptr, size_type _Count) const 
      { 
          if (_Mysize < _Off) 
              _String_base::_Xran(); 
          if (_Mysize - _Off < _N0) 
              _N0 = _Mysize - _Off; 
      
          size_type _Ans = _Traits::compare(_Myptr() + _Off, _Ptr, _N0 < _Count ? _N0 : _Count); 
          return (_Ans != 0 ? (int)_Ans : _N0 < _Count ? -1 : _N0 == _Count ? 0 : +1); 
      }

      Il y a donc tout intérêt à utiliser empty plutôt que compare ( != étant à bannir...)
      0