Académique Documents
Professionnel Documents
Culture Documents
Chap N°1 - Chaines de Caractères
Chap N°1 - Chaines de Caractères
Une chaine de caractère peut être considérée et manipulée comme étant un tableau de
caractères.
Le langage C offre des fonctions prédéfinies pour manipuler les chaînes comme étant des
variables simples.
Déclaration et mémorisation
char <NomVariable> [<Longueur>];
Exemples
La représentation interne d'une chaîne de caractères est terminée par le symbole '\0' (NULL)
=> pour un texte de n caractères, nous devons prévoir n+1 octets.
Le compilateur C ne contrôle pas si nous avons réservé un octet pour le symbole de fin de
chaîne; l'erreur se fera seulement remarquer lors de l'exécution du programme ...
Mémorisation
Comme les tableaux, le nom d'une chaîne est le représentant de l'adresse du premier
caractère de la chaîne.
- Le symbole " peut être représenté à l'intérieur d'une chaîne par la séquence
d'échappement \":
"Affichage de \"guillemets\" \n"
- Le symbole ' peut être représenté à l'intérieur d'une liste de caractères par la séquence
d'échappement \' :
{'L','\'','a','s','t','u','c','e','\0'}
Remarques
Pour la mémorisation de la chaîne de caractères "Hello", C a besoin de six octets ( et non 5 octets).
‘a’ est un caractère constant, qui a une valeur numérique (son code ascii)
"a" est un tableau de caractères qui contient deux caractères: la lettre ‘a’ et le caractère NULL : ‘\0’.
‘a’ est codé dans un octet
"a" est codé dans deux octets
En général, les tableaux sont initialisés par l'indication de la liste des éléments du tableau
entre accolades:
Pour le cas spécial des tableaux de caractères, nous pouvons utiliser une initialisation plus
confortable en indiquant simplement une chaîne de caractère constante:
Exemples
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[6];
Nous avons défini un tableau A avec six éléments, auxquels on peut accéder par:
A[0], A[1], ... , A[5]
Exemple
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:
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
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:
2) 'a1' = 'b1' et
Exemples
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
La bibliothèque <stdio> 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.
printf avec le spécificateur de format %s permet d'intégrer une chaîne de caractères dans une
phrase.
Exemples
puts est idéale pour écrire une chaîne constante ou le contenu d'une variable dans une ligne
isolée.
Exemples
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 stdin et le mémorise à
l'adresse qui est associée à %s.
Exemple
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
* Les noms des variables numériques (int, char, long, float, ...) doivent être marqués par le
symbole '&' (voir chap 4.4.).
gets est idéal pour lire une ou plusieurs lignes de texte (p.ex. des phrases) terminées par un
retour à la ligne.
gets( <Chaîne> )
Syntaxe:
gets lit une ligne de de caractères de stdin et la copie à l'adresse indiquée par <Chaîne>. Le
Effet:
retour à la ligne final est remplacé par le symbole de fin de chaîne '\0'.
Exemple
Les fonctions de <ctype> servent à classifier et à convertir des caractères. Les fonctions
de <ctype> sont indépendantes du code de caractères de la machine et favorisent la portabilité
des programmes. Dans la suite, <c> représente une valeur du type int qui peut être
représentée comme caractère.
Les fonctions de conversion suivantes fournissent une valeur du type int qui peut être
représentée comme caractère; la valeur originale de <c> reste inchangée:
Les trois fonctions définies ci-dessous correspondent au standard ANSI-C et sont portables.
Le symbole <s> peut être remplacé par :
atof(<s>) retourne la valeur numérique représentée par <s> comme double (!)
char STR[200];
puts("Entrez un nombre :");
gets(STR);
printf("Entrée = %s \n", STR);
printf("integer = %d \n", atoi(STR));
printf("long = %ld \n", atol(STR));
printf("double = %f \n", atof(STR));
Quelles sont les valeurs affichées si on entre les chaînes de caractères suivantes:
a) 123
b) -123
c) - 123
d) 123.45
e) 12E3
f) 1234f5
g) -1234567
h) 123e-02
i) -0,1234
Le standard ANSI-C ne contient pas de fonctions pour convertir des nombres en chaînes de
caractères. Si on se limite aux systèmes fonctionnant sous DOS, on peut quand même utiliser
les fonctions itoa, ltoa et ultoa qui convertissent des entiers en chaînes de caractères.
Chacune de ces trois procédures convertit son premier argument en une chaîne de caractères
qui sera ensuite attribuée à <s>. La conversion se fait dans la base <b>.
est un nombre du type int
<n_int>
si <s>
négatif
précède <t>
si <s> est
zéro
égal à <t>
si <s> suit
positif
<t>
strncpy(<s>,
copie au plus <n> caractères de <t> vers <s>
<t>, <n>)
Exemples
Char ch[10] ;
Gets(ch) ;
La longueur de ch est 5.
- Comme le nom d'une chaîne de caractères représente une adresse fixe en mémoire, on ne
peut pas 'affecter' une autre chaîne au nom d'un tableau:
strcpy(A, "Hello");
Exemple si ch1 est “hello_” et ch2 est “Mec_gmp”, la ligne strncpy(ch1,ch2,3) mets dans ch1
la chaine hello_Mec
scanf(“%s%s”,ch,ch2); // pour la saisie de chaines on ne met pas le symbole & avant le nom
de la chaine puisque le nom d’une chaine représente l’adresse de sa première case.
strcat(ch1,ch2);
printf(“ch1= %s et ch2=%s”,ch1,ch2);
si ch1 est “hello_” et ch2 est “mec_gmp”, le résultat affiché sur l’écran sera :
ch1=hello_mec_gmp ch2=mec_gmp
Notez bien qu’il faut que la taille de ch1 doit être capable de contenir les deux chaines
concaténées.
La fonction strcmp peut fournir différentes valeurs d’entiers comme résultats et ceci dépend
de la machine utilisée.
Exemple :
Char ch1[10], ch2[10] ;
Scanf(“%s%s“,ch1,ch2);
If(strcmp(ch1,ch2)>0)
Printf(“ch1>ch2”);
Else
If(strcmp(ch1,ch2)<0)
Printf(“ch1<ch2”);
Else
Printf(“ch1=ch2”);
La fonction strchr(ch,c) retourne une sous chaine qui commence par le caractère cherché
exemple :
Char ch[20] ;
Char c ;
Scanf(“%s“,ch);
Scanf(“%s”,&c);
Printf(“%s”,strchr(ch,c));
Si l’utilisateur saisit la chaine “hello” et le carcatère ‘e’ alors le résultat affiché sera
ello
Déclaration
Initialisation
Lors de la déclaration il est possible d'initialiser toutes les composantes du tableau par des
chaînes de caractères constantes:
char JOUR[7][9]= {"lundi", "mardi", "mercredi",
"jeudi", "vendredi", "samedi",
"dimanche"};
Mémorisation
Les tableaux de chaînes sont mémorisés ligne par ligne. La variable JOUR aura donc besoin de 7*9*1
= 63 octets en mémoire.
Il est possible d'accéder aux différentes chaînes de caractères d'un tableau, en indiquant
simplement la ligne correspondante.
Exemple
affichera la phrase:
Affectation
Des expressions comme JOUR[I] représentent l'adresse du premier élément d'une chaîne de
caractères. N'essayez donc pas de 'modifier' une telle adresse par une affectation directe !
Exemple
La commande
strcpy(JOUR[4], "Friday");
changera le contenu de la 5e composante du tableau JOUR de "vendredi" en "Friday".
Exemple
L'instruction
l m m j v s d