#include <string.h> // <cstring> en C++
int strcoll( const char * first, const char * second );
Cette fonction permet de comparer deux chaînes de caractères et de savoir si la première est inférieure, égale ou supérieure à la seconde. Cette comparaison sera réalisée en tenant compte de la localisation en cours et de manière « case insensitive » (non sensible à la casse).
Par défaut, un programme C utilise la localisation "C". Dans cette configuration, ce sont les codes numériques des caractères qui sont utilisés pour les
comparer. Cela peut être problématique pour nous : par exemple, nos caractères accentués sont tous positionnés bien au-delà des lettres ASCII.
Sans changement de la localisation utilisée par votre programme, le comportement de la fonction strcoll
sera donc strictement équivalent
à celui de la fonction strcmp
.
setlocale
(elle est définie dans l'entête <locale.h>
),
comme le montre l'exemple de code ci-dessous.
Trois cas distincts doivent être considérés. Soit les deux chaînes sont égales : dans ce cas, une valeur nulle sera retournée. Soit la première chaîne est plus petite que la seconde : dans ce cas, une valeur négative sera retournée. Soit la première chaîne est plus grande que la seconde : dans ce dernier cas, une valeur positive sera renvoyée.
L'exemple de code suivant se propose de montrer les différences de comportement entre les deux fonctions strcmp
et strcoll
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
#include <locale.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define ELEMENT_COUNT 10 int main() { // Si le second paramètre de la fonction setlocale est null, // alors cette fonction renvoit la localisation actuellement utilisée par le programme. // Par défaut, un programme C utilise la configuration "C" qui est basée sur ASCII (ou dérivés). printf( "Locale is: %s\n", setlocale( LC_ALL, NULL ) ); // On demande à utiliser le localisation configurée sur la machine hôte setlocale( LC_ALL, "" ); // On vérifie le changement de localisation (pour moi : fr_FR.utf8). printf( "Locale is: %s\n", setlocale( LC_ALL, NULL ) ); // On compare les chaînes sans tenir compte de la localisation. (on ne considére que // les codes des caractères ; les accents sont bien après les lettres non accentuées). printf( "strcmp : éléphant VS fouine : %d\n", strcmp( "éléphant", "fuine" ) ); // On compare les chaîne en tenant compte de la localisation courante. // Si vous êtes bien configuré en français, la chaîne de caractères "éléphant" sera // considérée comme étant inférieure à la chaîne "fouine". printf( "strcoll : éléphant VS fouine : %d\n", strcoll( "éléphant", "fuine" ) ); // strcmp est "case sensitive", strcoll est "case insensitive" ! printf( "strcmp : Lion VS albatros : %d\n", strcmp( "Lion", "albastros" ) ); printf( "strcoll : Lion VS albatros : %d\n", strcoll( "Lion", "albastros" ) ); return EXIT_SUCCESS; } |
Et voici les résultats produits par cet exemple de code :
$> gcc -o sample sample.c $> ./sample Locale is: C Locale is: fr_FR.utf8 strcmp : éléphant VS fouine : 1 strcoll : éléphant VS fouine : -1 strcmp : Lion VS albatros : -1 strcoll : Lion VS albatros : 11 $>
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :