String de la STL et comparaison de chaines [Résolu]

Signaler
Messages postés
229
Date d'inscription
dimanche 14 septembre 2003
Statut
Membre
Dernière intervention
20 août 2014
-
Messages postés
475
Date d'inscription
dimanche 3 octobre 2004
Statut
Membre
Dernière intervention
11 août 2006
-
Slt, je cherche un moyen de faire une comparaison de 2 chaines déclarées en string et donc en utilisant la stl seulement il n'y a pas de fonction de comparaison ne respectant pas la casse

comment régler ce problème ?
par dérivation / héritage vers une autre classe ?
utiliser basic_string ou char_traits ?

on m'a dit qu'on pouvait définir la fonction de comparaison utilisée par string mais j'ai beau cherche je ne trouve rien à ce sujet

5 réponses

Messages postés
475
Date d'inscription
dimanche 3 octobre 2004
Statut
Membre
Dernière intervention
11 août 2006
3
j'ai fais une erreur en modifiant les objets

template< class charT >
bool equal( const std::basic_string< charT > & s1, const std::basic_string< charT > & s2)
{
std::string _s1, _s2;
std::transform( s1.begin(), s1.end(), _s1.begin(), toupper );
std::transform( s2.begin(), s2.end(), _s2.begin(), toupper );

return _s1 == _s2;
}
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
17
for (string::size_t i (0); i < min (Str1.size(), Str2.size()); ++i)
{
Str1 [i] = toupper (Str1 [i]);
Str2 [i] = toupper (Str2 [i]);
}
bool Comparaison (Str1 Str2);
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
a ce rythme la autant comparer les caractères 1 par 1, ca évitera de mofier la chaine:

bool equal(const string Str1, const string Str2)
{
int size = min (Str1.size(), Str2.size());
for (string::size_t i = 0; i < size; ++i)
if(toupper (Str1 [i]) != toupper (Str2 [i]))
return false
return true
}
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
17
effectivement, merci de m'avoir corrigé, c'est vrai que c'etait pas super intelligent...
Messages postés
475
Date d'inscription
dimanche 3 octobre 2004
Statut
Membre
Dernière intervention
11 août 2006
3
bonjour,

utilisez plutot l'algo std::transform de la stl, et passez toujours std::string par reference

// prototype du model toupper
template <class charT> charT toupper(charT c, const locale &l) const;

template< class charT >
bool equal( const std::basic_string< charT > & s1, const std::basic_string< charT > & s2)
{
std::transform( s1.begin(), s1.end(), s1.begin(), toupper );
std::transform( s2.begin(), s2.end(), s2.begin(), toupper );

return s1 == s2;
}

pour iterer un objet std::string, l'index doit etre du type std::string::size_type

le c++ pour les hommes
http://cpptips.hyperformix.com/