Rechercher
 

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 :

Fonction strcoll

La fonction strcmp La fonction strcpy


Entête à inclure

#include <string.h>  // <cstring> en C++

Fonction strcmp

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.

pour changer la localisation à utiliser, vous pouvez utiliser la fonction setlocale (elle est définie dans l'entête <locale.h>), comme le montre l'exemple de code ci-dessous.

Paramètres

Valeur de retour

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.

Exemple de code

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;
}
Comparaison des fonctions strcoll et strcmp

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
$>

Sujets connexes

malloc
strcat
strcmp
strcpy
strlen


La fonction strcmp La fonction strcpy