Précédence alphabétique des caractères
La précédence des caractères dans l'alphabet d'une machine est dépendante du code de caractères utilisé. Pour le code ASCII, nous pouvons constater l'ordre suivant:
. . . ,0,1,2, ... ,9, . . . ,A,B,C, ... ,Z, . . . ,a,b,c, ... ,z, . . .
Les symboles spéciaux (' ,+ ,- ,/ ,{ ,] , ...) et les lettres accentuées (é ,è ,à ,û , ...) se trouvent répartis autour des trois grands groupes de caractères (chiffres, majuscules, minuscules). Leur précédence ne correspond à aucune règle d'ordre spécifique.
Relation de précédence
De la précédence alphabétique des caractères, on peut déduire une relation de précédence 'est inférieur à' sur l'ensemble des caractères. Ainsi, on peut dire que
'0' est inférieur à 'Z'
et noter
'0' < 'Z'
car dans l'alphabet de la machine, le code du caractère '0' (ASCII: 48) est inférieur au code du caractère 'Z' (ASCII: 90).
Précédence lexicographique des chaînes de caractères
En nous basant sur cette relation de précédence alphabétique des caractères, nous pouvons définir une précédence lexicographique pour les chaînes de caractères. Cette relation de précédence suit l'<<ordre du dictionnaire>> et est définie de façon récurrente:
a) La chaîne vide "" précède lexicographiquement toutes les autres chaînes.
b) La chaîne A = "a1a2a ... ap" (p caractères) précède lexicographiquement la chaîne B = "b1b2 ... bm" (m caractères) si l'une des deux conditions suivantes est remplie:
1) 'a1' < 'b1'
2) 'a1' = 'b1' et
"a2a3 ... ap" précède lexicographiquement "b2b3 ... bm"
Exemples
"ABC" précède
"BCD" |
car 'A'<'B' |
"ABC" précède
"B" |
car 'A'<'B' |
"Abc"précède
"abc" |
car 'A'<'a' |
"ab" précède
"abcd" |
car "" précède
"cd" |
" ab" précède
"ab" |
car ' '<'a' |
(le code ASCII de ' ' est
32, et le code ASCII de 'a' est 97) |
Remarque
Malheureusement, il existe différents codes de caractères (p.ex. ASCII, EBCDIC, ISO) et l'ordre lexicographique est dépendant de la machine. Même la fonction strcmp qui indique la précédence lexicographique de deux chaînes de caractères (voir 8.6.2.) dépend du code de caractères utilisé.
Conversions et tests
En tenant compte de l'ordre alphabétique des caractères, on peut contrôler le type du caractère (chiffre, majuscule, minuscule).
Exemples
if (C>='0' && C<='9') cout<<"Chiffre "<<C<<endl; if (C>='A' && C<='Z') cout<<"Majuscule "<<C<<endl; if (C>='a' && C<='z') cout<<"Minuscule "<<C<<endl;
Il est facile, de convertir des lettres majuscules dans des minuscules:
if (C>='A' && C<='Z') C = C-'A'+'a';
ou vice-versa:
if (C>='a' && C<='z') C = C-'a'+'A';
Remarque
Le code EBCDIC est organisé en zones, de façon que les caractères des trois grands groupes ne sont pas codés consécutivement. (P.ex.: les codes des caractères 'i' et 'j' diffèrent de 8 unités). Les méthodes de conversion discutées ci-dessus ne fonctionnent donc pas correctement dans le code EBCDIC et un programme portable doit être écrit à l'aide des fonctions (isalpha, islower, toupper, ...) de la bibliothèque <ctype> qui sont indépendantes du code de caractères (voir 8.6.4.).