| Nombre de visites |  |
| | Les chaines des caractères | Dim 16 Mar - 20:45 par tifouri |
Les chaınes de caractères :
Les chaınes de caractères sont représentes en C sous la forme d’un pointeur sur une zone contenant des caractères.
La fin de la chaıne est marquée par le caractère spécial ’\0’. Il est possible d’utiliser la déclaration sous forme de tableau : char ch[256]; définit une chaıne dont la longueur maximale est ici de 256 caractères, en comptant le caractère de terminaison. En fait, par convention, toute chaıne de caractère se termine par le caractère nul (pas le chiffre ’0’,
On peut écrire des chaînes constantes délimites par des guillemets. L’expression "chaine\n" est donc une
chaine comportant le mot chaine suivi d’un retour chariot, et comme toujours terminée par un caractère ’\0’.
La fonction strlen(s) (déclare dans < string.h > dans la bibliothèque standard) retourne la longueur de la
chaıne s jusqu’au premier code ’\0’. La fonction strcmp(s1,s2) permet de comparer deux chaınes. El retourne -1 si lexicographiquement s2 >s1, 0 si les deux chaînes sont identiques, et +1 si s1>s2.
Accès aux éléments d'une chaîne :
L'accès à un élément d'une chaîne de caractères peut se faire de la même façon que l'accès à un élément d'un tableau. En déclarant une chaîne par:
char A[10];
Nous avons défini un tableau A avec 9 éléments, auxquels on peut accéder par:
A[0], A[1], ... , A[9]
Exemple :

Précédence alphabétique et lexicographique
1) 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: 4 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'<> 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
| Code: | "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 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
| Code: | if (C>='0' && C<='9') printf("Chiffre\n", C);
if (C>='A' && C<='Z') printf("Majuscule\n", C);
if (C>='a' && C<='z') printf("Minuscule\n", C);
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'; |
La bibliothèque nous offre des fonctions qui effectuent l'entrée et la sortie des données. A côté des fonctions printf et scanf que nous connaissons déjà, nous y trouvons les deux fonctions puts et gets, spécialement conçues pour l'écriture et la lecture de chaînes de caractères.
- Affichage de chaînes de caractères
Printf avec le spécificateur de format %s permet d'intégrer une chaîne de caractères dans une phrase.
En plus, le spécificateur %s permet l'indication de la largeur minimale du champ d'affichage. Dans ce champ, les données sont justifiées à droite. Si on indique une largeur minimale négative, la chaîne sera justifiée à gauche. Un nombre suivant un point indique la largeur maximale pour l'affichage.
Exemples
| Code: | char NOM[] = "SMI, OUJDA";
printf(":%s:", NOM); -> :SMI, OUJDA:
printf(":%5s:", NOM); -> :SMI, OUJDA:
printf(":%15s:", NOM); -> : SMI, OUJDA:
printf(":%-15s:", NOM); -> :SMI, OUJDA :
printf(":%.3s:", NOM); -> :SMI: |
puts est idéale pour écrire une chaîne constante ou le contenu d'une variable dans une ligne isolée.
Syntaxe: puts( )
Effet: puts écrit la chaîne de caractères désignée par sur stdio et provoque un retour à la ligne. En pratique,
puts(TXT); est équivalent à printf("%s\n",TXT);
Exemples
| Code: | char TEXTE[] = "Voici une première ligne.";
puts(TEXTE);
puts("Voici une deuxième ligne."); |
- Lecture de chaînes de caractères
scanf avec le spécificateur %s permet de lire un mot isolé à l'intérieur d'une suite de données du même ou d'un autre type.
Effet: scanf avec le spécificateur %s lit un mot du fichier d'entrée standard stdio et le mémorise à l'adresse qui est associée à %s.
Exemple
| Code: | char LIEU[25];
int JOUR, MOIS, ANNEE;
printf("Entrez lieu et date de naissance : \n");
scanf("%s %d %d %d", LIEU, &JOUR, &MOIS, &ANNEE); |
Remarques importantes - La fonction scanf a besoin des adresses de ses arguments:
* Les noms des variables numériques (int, char, long, float, ...) doivent être marqués par le symbole '&' .
* Comme le nom d'une chaîne de caractères est le représentant de l'adresse du premier caractère de la chaîne, il ne doit pas être précédé de l'opérateur adresse '&' !
- La fonction scanf avec plusieurs arguments présuppose que l'utilisateur connaisse exactement le nombre et l'ordre des données à introduire! Ainsi, l'utilisation de scanf pour la lecture de chaînes de caractères est seulement conseillée si on est forcé de lire un nombre fixé de mots en une fois.
gets est idéal pour lire une ou plusieurs lignes de texte (p.ex. des phrases) terminées par un retour à la ligne.
Syntaxe: gets( )
Effet: gets lit une ligne de caractères de stdio et la copie à l'adresse indiquée par . Le retour à la ligne final est remplacé par le symbole de fin de chaîne '\0'.
Exemple
| Code: | int oujda = 1000;
char smi[oujda];
gets(smi); |
| | Commentaires: 5 |
|
| Sondage |
| Quel est à votre avis le meilleur système d'exploitation? | | Windows | | 31% | [ 5 ] | | Linux | | 50% | [ 8 ] | | MacOS | | 18% | [ 3 ] | | Autres | | 0% | [ 0 ] |
| | Total des votes : 16 |
|
| Qui est en ligne ? | Il y a en tout 1 utilisateur en ligne :: 0 Enregistré, 0 Invisible et 1 Invité
Utilisateurs enregistrés : Aucun
[ Voir toute la liste ] Le record du nombre d’utilisateurs en ligne est de 9 le Ven 29 Fév - 20:54
|
| Statistiques | Nous avons 110 membres enregistrés L’utilisateur enregistré le plus récent est eldiable2005
Nos membres ont posté un total de 920 messages dans 278 sujets
|
|