comparaison de chaine "case-insensitive" en c++ - C++ - Programmation
Marsh Posté le 01-02-2003 à 15:30:46
Captain ad-hoc a écrit : Je me demande quel le moyen le plus "propre" pour comparer deux std::string sans prendre en compte la casse des caractères ? strcasecmp c'est bien mais c'est pas du c++ et la portabilité est douteuse. Y'a une feinte avec les facets ou un truc du genre ? |
tu peux faire une boucle explicite pour comparer et utiliser toupper () sur chaque caractere pour la comparaison. dans la classe basic_string, y a pas de fonction pour la comparaison sans tenir compte de la casse
Marsh Posté le 01-02-2003 à 15:50:12
Utilises ca avec une fonction de comparaison de char adaptée :
http://www.sgi.com/tech/stl/lexico [...] mpare.html
Marsh Posté le 01-02-2003 à 15:55:05
Kristoph a écrit : Utilises ca avec une fonction de comparaison de char adaptée : |
j'l'avais oublié celle la
mais ce qui est un peu chiant c'est qu'elle renvoie un booléen:
par contre elle est utilisable sur toutes les séquences
Marsh Posté le 01-02-2003 à 15:59:09
ouaip, 2 solutions:
- copier les 2chaines a comparer, convertir chaque caractère en minuscule/majuscule avec std::toupper/std::tolower, et comparer avec le std::string::compare ou <, >, etc
- réécrire une std::strcmp, avec std::tolower(s1[i]) ?? std::tolower(s2[i]). sans doute la meilleur solution surtout si les chaines sont longues, à condtion de pas coder comme un pied. donc je propose
Code :
|
Marsh Posté le 01-02-2003 à 16:02:04
Code :
|
Marsh Posté le 01-02-2003 à 16:03:07
ma version est bien plus performante
edit: arg, j'ai oublié de traiter le cas final
Marsh Posté le 01-02-2003 à 16:04:21
ReplyMarsh Posté le 01-02-2003 à 16:07:41
gloop a écrit : |
a y est.
il me semble que strcmp renvoie une différence de caractère et pas seulement -1, 0, ou 1...
edit: oups, ça dépend de l'implémentation: en fait c'est valeur <0, ==0 ou >0
Marsh Posté le 01-02-2003 à 16:12:55
gloop a écrit : |
cela dit merci à toi de montrer par l'exemple que bien que les string soit des pseudo-containers, elles proposent des itérateurs
Marsh Posté le 01-02-2003 à 16:13:18
ok, merci les ptits gars pour vos réponses c'est quand même dommage qu'il n'y ait rien de tout cuit pour ça dans la class basic_string je trouve
Marsh Posté le 01-02-2003 à 16:21:16
skom ça...faut dire aussi que la comarasion pas sensible à la casse est tres dure à définir (en francais, les majuscules doivent etre accentuées ou avoir une cédille, personne ne le fait, et pourtant), cela dépend beaucoup du contexte local.
Marsh Posté le 01-02-2003 à 16:52:27
Ce cas figure dans un bouquin ("mieux programmer en C++" je crois)
Malheureusement je ne l'ai pas sous les yeux et c'est assez loin
Je me souvient qu'ils ont créé leur propre fonction compare de char_traits que string utilise et ont créé leur classe identique a string sauf qu'elle utilise cette fonction de comparaison. Y'avait ensuite une discution sur l'utilité d'une telle classe ... arf c'est un peu loin.
Mais voila de quoi te donner un piste :
la fonction de comparaison utilisee est dans char_traits.h
Code :
|
faut remplacer par memicmp.
string est definie ainsi :
Code :
|
faut modifier le char_traits utilisé, peut etre un truc du genre :
Code :
|
enfin c'est une piste, car les templates, je m'y suis jamais plongé.
Marsh Posté le 01-02-2003 à 16:56:31
HelloWorld a écrit : Ce cas figure dans un bouquin ("mieux programmer en C++" je crois)
|
c une bonne idée , mais ca oblige à utiliser 2 types pour les chaines de caractéres. et en + si t'as besoin de comparer un string et istring, c pas le + pratique
Marsh Posté le 02-02-2003 à 01:50:50
Je crois que c'etait un des points souleves quant a l'utilite de cette classe : que faire lors de la comparaison d'une string avec une istring.
Et sinon, un simple
Code :
|
Parce que bon, copier les 2 chaines, les convertir en upper, ca me parrait bourrin quand même.
Marsh Posté le 02-02-2003 à 02:04:54
J'ai trouvé ca :
http://www.josuttis.com/libbook/st [...] g.hpp.html
http://www.josuttis.com/libbook/st [...] 1.cpp.html
encore mieux :
http://www.josuttis.com/libbook/string/iter2.cpp.html
Marsh Posté le 02-02-2003 à 07:19:52
trucicmp connait po
avec gloop on s'est employé a trouver la solution standard, sinon j'aurais vite dégainé une page de man. bien joué les liens de HW, c'est une bonne idée de tout enrober dans une classe, mais j'aurais pas été jusqu'au point de créer un nouveau type de string, je me serai contenté de fonctions membres statiques pour usage
Marsh Posté le 02-02-2003 à 16:16:55
Je savais pas que c'etait pas standard.
On la trouve quand meme a peu pres partout cette fonction. C'est un standard du non-standard !
Marsh Posté le 04-02-2003 à 12:09:34
Coucou,
Je sais qu'au depart on ne compare que des chaines de caracteres 7bits, mais si on s'interresse au probleme des accents, quelle est la meilleure solution.
Deux cas :
1- on veut ignorer la casse ET les accents,
2- on veut ignorer la casse mais respecter les accents,
Perso je vois pas d'autre solution qu'une implementation similaire a celle de ++Taz, ou l'on ferait caractere par caractere et, si le caractere n'est pas ascii (<0) on se tape une recherche dans une table associant chaque caractere special a son equivalent majuscule, avec ou sans accent suivant le cas.
Qu'en pensez vous ?
Marsh Posté le 16-07-2008 à 11:48:31
Taz a écrit : ma version est bien plus performante |
Bonjour Taz,
Ton code me plait mais je ne vois pas de quel cas final tu parles?
merci de m'apporter une précision.
Marsh Posté le 16-07-2008 à 16:41:47
le_num a écrit : |
il a déjà edité et corrigé, c'est pour ca que ca te plait
Marsh Posté le 16-07-2008 à 20:53:28
ya un Gotw à ce propos:
http://www.gotw.ca/gotw/029.htm
Marsh Posté le 01-02-2003 à 15:25:26
Je me demande quel le moyen le plus "propre" pour comparer deux std::string sans prendre en compte la casse des caractères ? strcasecmp c'est bien mais c'est pas du c++ et la portabilité est douteuse. Y'a une feinte avec les facets ou un truc du genre ?
Je précise que c'est pas pour comparer des chaine des caractères chinois en UTF8, c'est juste pour des chaines en ascii 7 bit donc rien de méchant