OVH Cloud OVH Cloud

fonction C++ pour comparer deux string

62 réponses
Avatar
Geoffroy Baud
Bonjour,
existe-t-il dans les lib std
du C++ un moyen pour comparer deux
string, et que le test sois case
insensitive ?

if ( "NAME" == "name" )
return TRUE;


merci


--
-------------------------------------------------------------------
Geoffroy Baud geoffroy.baud@wanadoo.fr
0AE5 7A1B 527D 3966 8EBE 2EC0 AA79 EB54 7D7D 7CEC
-------------------------------------------------------------------

10 réponses

3 4 5 6 7
Avatar
Falk Tannhäuser
wrote:
En allemand, par exemple, si j'ignore la case, je dois avoir "Fuß" = > "FUSS". Ce que je ne sais pas faire en Java ; en C++, c'est précisement
le but des facettes std::collate.
Il y a une subtilité pas évidente à gérer : "Maße" (pluriel de "Maß") devrait

comparer égal à "MASZE" plutôt qu'à "MASSE" ; ceci afin d'éviter la confusion
avec "Masse", qui pourrait complètement changer le sens d'une phrase :
"Schnaps und Bier sollte man nur in MASZEN trinken, nicht in MASSEN"
(non seulement avant de conduire, mais aussi avant de faire du C++ ...)

Falk "Ils sont fous, ces Teutons !" Tannhäuser

Avatar
kanze
Falk Tannhäuser wrote in message
news:...
wrote:
En allemand, par exemple, si j'ignore la case, je dois avoir "Fuß"
== "FUSS". Ce que je ne sais pas faire en Java ; en C++, c'est
précisement le but des facettes std::collate.


Il y a une subtilité pas évidente à gérer :


Il n'y en a pas qu'un.

"Maße" (pluriel de "Maß") devrait comparer égal à "MASZE" plutôt qu'à
"MASSE" ; ceci afin d'éviter la confusion avec "Masse", qui pourrait
complètement changer le sens d'une phrase : "Schnaps und Bier sollte
man nur in MASZEN trinken, nicht in MASSEN" (non seulement avant de
conduire, mais aussi avant de faire du C++ ...)


Ça, c'est en Allemagne, et encore, pas systèmatiquement.
(Officiellement, la règle existe, mais elle est souvent ignorée.) En
Suisse, et dans certaines applications en Allemagne (bottin
téléphonique, par exemple), « ändern » et « Aendern » doivent aussi
comparer égal.

Sans parler des règles de français, où on ignore les accents, sauf si
les mots seraient égaux, et puis, on considère l'accent le plus à droit
d'abord.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16


Avatar
Christophe Lephay
"Michel Michaud" a écrit dans le message de
news:rz9cb.5995$
Dans news:bkqdr5$gvs$, Christophe
switch, c'est avec les int, non ?


Non, avec les types « entier ». char en est un.


Le méchanisme mis en oeuvre concernant le paramètre du switch est une sorte
de surcharge ou une conversion ?

Chris


Avatar
kanze
"Christophe Lephay" wrote in message
news:<bkt3ck$r59$...
"Michel Michaud" a écrit dans le message de
news:rz9cb.5995$
Dans news:bkqdr5$gvs$, Christophe
switch, c'est avec les int, non ?


Non, avec les types « entier ». char en est un.


Le méchanisme mis en oeuvre concernant le paramètre du switch est une
sorte de surcharge ou une conversion ?


Oui:-).

En fait, l'expression de contrôle du switch peut être de type entier, de
type enum ou d'un type classe pour lequel il existe une (et une seule)
conversion vers un type entier ou un type enum. Si c'est de type classe,
la conversion aurait lieu. Ensuite, il y a « promotion » : c-à-d en gros
que pour un type entier plus petit qu'un int, il y a conversion en int.

En ce qui concerne les constantes dans les case, elles sont converties
aussi au type promu.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16



Avatar
Christophe Lephay
a écrit dans le message de
news:
"Christophe Lephay" wrote in message
news:<bkt3ck$r59$...
"Michel Michaud" a écrit dans le message de
news:rz9cb.5995$
Dans news:bkqdr5$gvs$, Christophe
switch, c'est avec les int, non ?


Non, avec les types « entier ». char en est un.


Le méchanisme mis en oeuvre concernant le paramètre du switch est une
sorte de surcharge ou une conversion ?


Oui:-).

En fait, l'expression de contrôle du switch peut être de type entier, de
type enum ou d'un type classe pour lequel il existe une (et une seule)
conversion vers un type entier ou un type enum. Si c'est de type classe,
la conversion aurait lieu. Ensuite, il y a « promotion » : c-à-d en gros
que pour un type entier plus petit qu'un int, il y a conversion en int.


Donc Fabien avait raison : sitch, c'est bien avec les int, avec conversion
vers int le cas échéant ?

Chris




Avatar
kanze
"Christophe Lephay" wrote in message
news:<bkum87$obp$...
a écrit dans le message de
news:
"Christophe Lephay" wrote in message
news:<bkt3ck$r59$...
"Michel Michaud" a écrit dans le message de
news:rz9cb.5995$
Dans news:bkqdr5$gvs$, Christophe

switch, c'est avec les int, non ?


Non, avec les types « entier ». char en est un.


Le méchanisme mis en oeuvre concernant le paramètre du switch est
une sorte de surcharge ou une conversion ?


Oui:-).

En fait, l'expression de contrôle du switch peut être de type
entier, de type enum ou d'un type classe pour lequel il existe une
(et une seule) conversion vers un type entier ou un type enum. Si
c'est de type classe, la conversion aurait lieu. Ensuite, il y a «
promotion » : c-à-d en gros que pour un type entier plus petit qu'un
int, il y a conversion en int.


Donc Fabien avait raison : sitch, c'est bien avec les int, avec
conversion vers int le cas échéant ?


Ça dépend de l'expression de contrôle. Si le type de l'expression est
long, par exemple, ou unsigned il n'y a pas de conversion, et les
constantes sont converties en long ou unsigned. (Question intéressante :
donnée une implémentation où le résultat d'une conversion vers signé qui
ne passe pas génère un signal, qu'est-ce qui se passe si l'expression de
contrôle est un long, et une des constantes est un unsigned qui ne passe
pas dans un long, disons 0x80000000U sur une machine 32 bits ?)

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16





Avatar
Christophe Lephay
a écrit dans le message de
news:
"Christophe Lephay" wrote in message
Donc Fabien avait raison : sitch, c'est bien avec les int, avec
conversion vers int le cas échéant ?


Ça dépend de l'expression de contrôle. Si le type de l'expression est
long, par exemple, ou unsigned il n'y a pas de conversion, et les
constantes sont converties en long ou unsigned.


Ok, merci...

(Question intéressante :
donnée une implémentation où le résultat d'une conversion vers signé qui
ne passe pas génère un signal, qu'est-ce qui se passe si l'expression de
contrôle est un long, et une des constantes est un unsigned qui ne passe
pas dans un long, disons 0x80000000U sur une machine 32 bits ?)


C'est pas moi qui répondrait à cette question... :)

Chris


Avatar
Nophké
Bonjour,
existe-t-il dans les lib std
du C++ un moyen pour comparer deux
string, et que le test sois case
insensitive ?

if ( "NAME" == "name" )
return TRUE;


NON!

Cependant...

Les caractères minuscules ont les codes ascii de 97(a) à 122(z).
Les caractères majuscules ont les codes ascii 65(A) à 96(Z).
La différence entre un caractère minuscule et majuscule est de 32.

char a = 'A'; // identique à " char a = 97 "
char b = 'a'; // identique à " char b = 65 "
char c = (a - 32); // passe A en minuscule

Pour l'instant c'est tres facile! Bon maintenant!

Prenons un tableau char tableau[5+1];

for (i=0;i=5;i++){
if (tableau[i] > 64 && tableau[i] < 97)
tableau[i] +2;
}
Ceci passe ton tableau en minuscules !


for (i=0;i=5;i++){
if (tableau[i] > 96 && tableau[i] < 122)
tableau[i] +2 ;
}
Ceci passe ton tableau en majuscules !

Facile? Non?
Il ne te reste plus qu'à comparer!

merci


Je t'en prie!

Avatar
Luc Hermitte
Salut,

"Nophké" wrote in news:3f7acf48$0$28886
$:

La différence entre un caractère minuscule et majuscule est de 32.


Quitte à vouloir se la jouer, on fait carrément un "ou logique".
Mais bon, cette approche n'est pas valable avec tous les environnements et
ne tiens pas compte de la langue.

Le problème n'est pas aussi simpliste, cf les autres branches de cette
enfilade.

--
Luc Hermitte <hermitte at free.fr>
FAQ de <news:fr.comp.lang.c++> :
<http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/>
Dejanews : <http://groups.google.com/advanced_group_search>

Avatar
kanze
"Nophké" wrote in message
news:<3f7acf48$0$28886$...

existe-t-il dans les lib std du C++ un moyen pour comparer deux
string, et que le test sois case insensitive ?

if ( "NAME" == "name" )
return TRUE;


NON!

Cependant...

Les caractères minuscules ont les codes ascii de 97(a) à 122(z).
Les caractères majuscules ont les codes ascii 65(A) à 96(Z).


C'est vrai, mais je ne connais pas de machine aujourd'hui qui utilise
l'ASCII. Le encodage dépend toujours du locale, mais la plupart du
temps, le défaut, c'est ISO 8859-1 ou ISO 8859-15. Sur les systèmes les
plus avancés, on trouve plutôt UTF-8.

La différence entre un caractère minuscule et majuscule est de 32.


En ASCII. Non en ISO 8859-15 (qui est en voie de devenir l'encodage le
plus répandu, malgré les avantages réels de UTF-8). Et surtout non en
UTF-8.

En plus, sur la plupart des système, char est 8 bits, signé. Ce qui veut
dire qu'il faut tenir compte du fait que certains caractères ont en
réalité des valeurs négatives.

char a = 'A'; // identique à " char a = 97 "
char b = 'a'; // identique à " char b = 65 "
char c = (a - 32); // passe A en minuscule

Pour l'instant c'est tres facile! Bon maintenant!


J'adore ce façon de démontrer une chose. Pour un caractère, dans un
encodage précis, la différence entre majuscule et minuscule est
32. Donc, pour tous les caractères, dans tous les encodages, la
différence est 32.

(Faut croire qu'il ne s'est jamais servi de EBCDIC:-).)

Prenons un tableau char tableau[5+1];

for (i=0;i=5;i++){
if (tableau[i] > 64 && tableau[i] < 97)
tableau[i] +2;
}
Ceci passe ton tableau en minuscules !


Pas sur mes systèmes (Sun Solaris 2.8, Mandrake Linux 8.2 et Windows NT
4.0).

for (i=0;i=5;i++){
if (tableau[i] > 96 && tableau[i] < 122)
tableau[i] +2 ;
}
Ceci passe ton tableau en majuscules !

Facile? Non?


Les solutions qui ne marche pas sont souvent faciles.

Dans ce cas-ci, pour les encodages courants en Europe, autre que UTF-8,
et pour une défintion appropriée de la conversion (définition qui
pourrait à la rigueur convenir en France, mais pas en Allemagne), il y a
bien une solution facile : un tableau avec 256 entrées, convenablement
initialisé. C'est la solution classique, depuis l'époque de l'ASCII.
Aujourd'hui, on lui reconnaît ses desavantages, comme le fait de ne pas
fonctionner avec UTF-8, mais même les problèmes avec 'ß'. Le problème
n'est pas facile, MAIS... ça a déjà été résolu par d'autres. Plutôt que
de réinventer la roue (mais carré, cette fois-ci), il faudrait régarder
du côté std::collate, ou si ta bibliothèque n'est pas à jour, la
fonction C stdcoll.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16


3 4 5 6 7