Double comparaison de std string

Résolu/Fermé
cedric - Modifié par cedric le 12/09/2011 à 13:53
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 12 sept. 2011 à 14:05
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
A voir également:

3 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié par KX le 12/09/2011 à 13:50
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
Heremion Messages postés 539 Date d'inscription vendredi 20 mai 2011 Statut Membre Dernière intervention 1 juin 2022 102
12 sept. 2011 à 13:35
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
KX,
ca marche !

if ((CNX_A != "") && (CNX_B != ""))
{
//
}
Merci.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié par KX le 12/09/2011 à 14:10
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