String de la STL et comparaison de chaines

Résolu
shenron666 Messages postés 229 Date d'inscription dimanche 14 septembre 2003 Statut Membre Dernière intervention 20 août 2014 - 4 oct. 2004 à 12:01
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 - 4 oct. 2004 à 20:01
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

steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
4 oct. 2004 à 20:01
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;
}
3
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
4 oct. 2004 à 13:19
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);
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
4 oct. 2004 à 18:29
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
}
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
4 oct. 2004 à 18:36
effectivement, merci de m'avoir corrigé, c'est vrai que c'etait pas super intelligent...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
4 oct. 2004 à 19:55
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/
0
Rejoignez-nous