Vous êtes sur la page 1sur 32

Ecole Supérieure de Technologie

de Safi
1ère année GIM - INFORMATIQUE

LES CHAINES DE
CARACTERES EN C

A.SOULMANI
Type char
c1
char c1 = ‘A’; ‘A’ 1 octet

@2000

c2
char c2 = ‘6’; ‘6’ 1 octet

@2001

c3
char c3 = ‘+’; ‘+’ 1 octet

@2002

Questions:
❑ Comment savoir si un caractère est un chiffre?
❑ Comment savoir si un caractère est une lettre de l’alphabet?
❑ Comment savoir si un caractère est minuscule ou majuscule?
❑ Comment savoir si un caractère est une voyelle?
2
Code ASCII
+32

3
Code ASCII
/* Afficher la valeur du caractère et son code ASCII */
void main()
{
char c = 'a';
printf("Le caractere c est : %c\n",c);
printf("Son code ASCII est : %d\n",c);
}

❑ Avec le spécificateur de format "%c", on affiche la valeur du caractère.


❑ Avec le spécificateur de format "%d", on affiche le code ASCII du caractère.

/* Transformer un caractère minuscule en majuscule */


void main()
{
char min = 'a';
char maj = min - 32;
printf("Le caractere min est : %c\n",min);
printf("Le caractere maj correspondant est : %c\n",maj);
}

4
Code ASCII

/* Vérifier si un caractère est alphabétique minuscule ou majuscule */

void main()
{
char c;
printf("saisir un caractere : ");
scanf("%c",&c);
if (c >=97 && c<=122) printf ("minuscule!");
else if (c >=65 && c<=90) printf ("MAJUSCULE!");
else printf("Ce n'est pas un caractere alphabetique!");
}

5
CODE EBCDIC
Conversion
ASCII -- EBCDIC

6
Ordre 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, l'ordre est le suivant:


. . . ,0,1,2, ... ,9, . . . ,A,B,C, ... ,Z, . . . ,a,b,c, ... ,z, . . .

Relation de précédence:
▪ Le caractère '0’ a pour code ASCII: 48.

▪ Le caractère 'Z’ a pour code ASCII: 90.

▪ On peut dire que: '0' est inférieur à 'Z'

▪ On peut noter: '0' < 'Z'

7
Bibliothèque <ctype.h>

❑ 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.

8
Bibliothèque <ctype.h>
Fonctions de classification
La fonction Retourne une valeur différente de zéro,
isupper(<c>) si <c> est une majuscule ('A'...'Z')
islower(<c>) si <c> est une minuscule ('a'...'z')
isdigit(<c>) si <c> est un chiffre décimal ('0'...'9')
isalpha(<c>) si islower(<c>) ou isupper(<c>)
isalnum(<c>) si isalpha(<c>) ou isdigit(<c>)
isxdigit(<c>) si <c> est un chiffre hexa ('0'...'9' ou 'A'...'F' ou 'a'...'f')
isspace(<c>) si <c> est un signe d'espacement (' ', '\t', '\n', '\r', '\f')

Fonctions de conversion
La fonction Effet
tolower(<c>) retourne <c> converti en minuscule si <c> est une majuscule

toupper(<c>) retourne <c> converti en majuscule si <c> est une minuscule


9
Bibliothèque <ctype.h>
/* Vérifier si un caractère est alphabétique minuscule ou majuscule */
void main(){
char c;
printf("saisir un caractere : ");
scanf("%c",&c);
if (c >=97 && c<=122) printf ("minuscule!");
else if (c >=65 && c<=90) printf ("MAJUSCULE!");
else printf("Ce n'est pas un caractere alphabetique!");
}
Le résultat dépend du codage utilisé pour les caractères!

/* Vérifier si un caractère est alphabétique minuscule ou majuscule */


#include <ctype.h>
void main()
{
char c;
printf("saisir un caractere : ");
scanf("%c",&c);
if (islower(c)) printf ("minuscule!");
else if (isupper(c)) printf ("MAJUSCULE!");
else printf("Ce n'est pas un caractere alphabetique!");
}
10 Résultat indépendant du codage ce qui rend le programme portable!
Déclaration de chaîne de caractères
Constat:
❑ Le langage C ne propose pas de type prédéfini pour une chaîne de
caractères.
❑ Pour gérer les chaînes de caractères (string), on utilise des
tableaux de caractères.
❑ Une chaîne de caractère est un tableau de caractères dont le dernier
élément est le caractère ‘\0’.

Considérons deux tableaux str1 et str2:


str1 ‘H’ ‘e’ ‘l’ ‘l’ ‘o’ ‘\0’

str2 ‘H’ ‘e’ ‘l’ ‘l’ ‘o’

▪ str1 est une chaîne de caractères.


▪ str2 n’est pas une chaîne de caractères.
11
Déclaration de chaîne de caractères
Syntaxe: char identifiant[taille];

Exemple: char nom[30];

Déclaration avec initialisation:


❑ 1ère méthode:
char message = "Hello" ;
message
@2000 ‘H’ ‘e’ ‘l’ ‘l’ ‘o’ ‘\0’
@2000

❑ 2ème méthode:
char message[6] = {'H','e','l','l','o’};
▪ On a réservé la place pour 6 caractères dont on a initialisé 5.
12 ▪ Le dernier caractère sera par défaut initialisé à 0.
Utilisation de chaîne de caractères
❑ Le spécificateur de format "%s" sera utilisé pour lire ou écrire une
chaîne de caractères.

Lecture et écriture:
void main()
{
char nom[20];
printf("\t Saisir nom : ");
scanf( "%s" ,nom);
printf("\t Bonjour %s",nom);
}

❑ Avec scanf, on n’utilise pas d’opérateur & devant le nom de la chaîne de


caractères puisque le nom du tableau représente également son adresse.

13
Utilisation de chaîne de caractères
Lecture et écriture:

void main()
{
char nom[20];
printf("\t Saisir nom : ");
scanf( "%s" ,nom);
printf("\t Le nom est : %s",nom);
}

❑ On remarque que scanf() a arrêté la lecture au premier espace, ce qui peut poser un
problème dans certaines situations.
❑ Utiliser gets().
/* Utilisation de gets() */
void main()
{
char nom[20];
printf("\t Saisir nom : ");
gets(nom);
printf("\t Le nom est : %s",nom);
14 }
Utilisation de chaîne de caractères
Lecture et écriture:
❑ puts est idéale pour écrire une chaîne constante ou le contenu d'une variable
dans une ligne isolée.

❑ puts écrit la chaîne de caractères passée en argument sur stdout et provoque


un retour à la ligne.

puts(TXT); printf("%s\n",TXT);

15
Chaînes de caractères & Fonctions
Passage de chaîne de caractères en argument
❑ Même méthode que pour les tableaux.
❑ On passe uniquement l’adresse du tableau.

Argument chaîne de caractères non constante


char nom[]

char* nom

Argument chaîne de caractères constante


const char nom[]

const char* nom


❑ const : son usage est recommandé; elle signifie que la chaîne ne
peut pas être modifiée.
16
Chaînes de caractères & Fonctions
#include <stdio.h>
/* ********************************* */
void afficher( const char [],char [] );
/* ********************************* */
void main()
{
char nom[30] = "Premiere annee GIM";
afficher("Bonjour ", nom);
}
/* ********************************* */
void afficher( const char str[],char nom[] )
{
printf("\t %s %s ! ", str, nom);
}

17
Opérations sur chaînes de caractères
❑ Copier une chaîne dans une autre.
❑ Connaître la longueur.
❑ Extraire une partie d’une chaîne.
❑ Concaténer plusieurs chaînes.
❑ Comparer des chaînes.
❑ Connaître la position d’un caractère dans une chaîne.
❑ Connaître la position d’une sous-chaîne dans une chaîne.
❑ Remplacer une sous-chaîne par une autre.
❑ Transformer en majuscule ou en minuscule.
❑ Convertir en nombre et vice versa.
❑ … etc.
18
Bibliothèque <string.h>
❑ La bibliothèque string.h fournit des fonctions prédéfinies
permettant de manipuler des chaînes de caractères.
strlen()
Rôle: Renvoie la longueur de la chaîne de caractères passée en argument.
Le caractère ‘\0’ n’est pas comptabilisé.
Exemple:
str ‘H’ ‘e’ ‘l’ ‘l’ ‘o’ ‘\0’ Taille de str est 5.

Prototype:
unsigned int strlen(char[] ou char*);
#include <string.h>
void main()
{
char nom[20];
printf("\t Saisir nom : ");
gets(nom);
printf("\t La taille de nom est : %d",strlen(nom));
19 }
Bibliothèque <string.h>
notreStrlen():
#include <stdio.h>
/* ********************************* */
int notreStrlen(char []);
/* ********************************* */
void main()
{
char nom[30];
printf("\t Saisir nom : ");
gets(nom);
printf("\t La taille de nom est : %d", notreStrlen(nom));
}
/* ********************************* */
int notreStrlen(char c[])
{
int count = 0;
while (c[count] != ‘\0’){
count++;
}
return count;
}
20
Bibliothèque <string.h>
strcpy()
Affectation:
void main()
{
char nom1[20] = "Hello"; ✓ /* Juste */
char nom2[20];
nom2 = nom1;  /* Faux */
}

❑ En dehors de l’initialisation lors de la déclaration d’une chaîne, on ne


peut pas affecter une chaîne à une autre.

❑ On peut copier caractère par caractère.

❑ On peut utiliser directement la fonction strcpy().

21
Bibliothèque <string.h>
strcpy()

Char* strcpy(char *destination, char *source)


{
size_t i; /* size_t correspond à unsigned int */
for (i = 0; source[i] != '\0'; ++i)
destination[i] = source[i];
destination[i] = ‘\0’;
return destination;
}

22
Bibliothèque <string.h>
strcmp()
Comparaison de chaînes de caractères
Précédence lexicographique

Elle suit l’ "ordre du dictionnaire" et est définie de façon récurrente:

❑ La chaîne vide "" précède lexicographiquement toutes les autres


chaînes.
❑ La chaîne A = "a1a2 ... 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:
▪ 'a1' < 'b1'
▪ 'a1' = 'b1' et "a2a3 ... ap" précède lexicographiquement "b2b3 ... bm"

23
Bibliothèque <string.h>
strcmp()
Comparaison de chaînes de caractères
Précédence lexicographique

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)

24
Bibliothèque <string.h>
strcmp()

int strcmp(char *chaine1, char *chaine2)


{
while (*chaine1 == *chaine2)
{
if (*chaine1 == '\0’) return 0;
++chaine1;
++chaine2;
}
return (*chaine1 < *chaine2) ? -1 : 1;
}

25
Bibliothèque <string.h>
Fonction Rôle Valeur de retour
strlen(<s>) fournit la longueur de <s> longueur de <s>

strcpy(<s>,<t>) copie <t> vers <s> @ de la chaîne <s>

strcat(<s>,<t>) ajoute <t> à la fin de <s> @ de la chaîne <s>

▪ Négatif si <s> précède <t>


strcmp(<s>,<t>) compare <s> et <t> lexicographiquement. ▪ zéro si <s> est égal à <t>
▪ Positif si <s> suit <t>
strncpy(<s>,<t>,<n>) copie au plus <n> caractères de <t> vers <s> @ de la chaîne <s>

strncat(<s>,<t>,<n>) ajoute au plus <n> caractères de <t> à la fin de <s> @ de la chaîne <s>

▪ Si succès, @ de la première
strchr(<s>,<c>) Cherche le caractère <c> dans la chaîne <s> occurrence de <c> dans <s>.
▪ Si échec, un pointeur nul.
▪ Si succès, @ de la première
occurrence de <s2> dans
strstr(<s1>,<s2>) Cherche la présence de <s2> dans <s1> <s1>.
▪ Si échec, un pointeur nul.
▪ Si succès, @ de la première
Cherche la présence de l’un des caractères <s2>
strpbrk(<s1>,<s2>) occurrence dans <s1>.
dans <s1>
▪ Si échec, un pointeur nul.

26
Bibliothèque <stdlib.h>
❑ La bibliothèque <stdlib> contient des déclarations de fonctions pour
la conversion de chaînes de caractères en nombres et vice-versa.
Fonctions de conversion de chaînes de caractères en nombres
Fonction Rôle
atoi(<s>) retourne la valeur numérique représentée par <s> comme int
atol(<s>) retourne la valeur numérique représentée par <s> comme long
atof(<s>) retourne la valeur numérique représentée par <s> comme double (!)

Règles générales pour la conversion:


▪ Les espaces au début d'une chaîne sont ignorés.
▪ Il n'y a pas de contrôle de l’intervalle des valeurs de la cible.
▪ La conversion s'arrête au premier caractère non convertible.
▪ Pour une chaîne non convertible, les fonctions retournent zéro.

Fonctions de conversion de nombres en chaînes de caractères


❑ Non proposées dans le standard ANSI-C.
27
Tableau de chaînes de caractères
❑ Un tableau de chaînes de caractères est un tableau à deux dimensions de
type char, où chaque ligne contient une chaîne de caractères.

Déclaration
char tab[4][6];
tab
@2000 1ère chaîne
@2000
2ème chaîne
3ème chaîne
4ème chaîne

6 caractères par chaîne dont 5 significatifs

Déclaration avec initialisation


char tab[4][6] = {"Ali", "Amal", "Sam", "Salwa"} ;
tab
@2000 ‘A’ ‘l’ ‘i’ ‘\0’ 1ère chaîne
@2000
‘A’ ‘m’ ‘a’ ‘l’ ‘\0’ 2ème chaîne
‘S’ ‘a’ ‘m’ ‘\0’ 3ème chaîne
‘S’ ‘a’ ‘l’ ‘w’ ‘a’ ‘\0’ 4ème chaîne
28
Tableau de chaînes de caractères
Accès aux différentes chaînes
char tab[4][6] = {"Ali", "Amal", "Sam", "Salwa"} ;

tab @2000
@2000 ‘A’ ‘l’ ‘i’ ‘\0’ 1ère chaîne
(tab+1) @2006
@2006
‘A’ ‘m’ ‘a’ ‘l’ ‘\0’ 2ème chaîne
(tab+2) @2012
@2012 ‘S’ ‘a’ ‘m’ ‘\0’ 3ème chaîne
(tab+3) @2018
@2018
‘S’ ‘a’ ‘l’ ‘w’ ‘a’ ‘\0’ 4ème chaîne
❑ tab[i] permet d’accèder à la chaîne numéro (i+1).
void main()
{
char tab[4][6] = {"Ali", "Amal", "Sam", "Salwa"};
int i;
for ( i =0; i < 4; i++ )
printf("Chaine %d :\n\t Valeur: %5s; \t Adresse: %u\n",i+1,tab[i],tab+i);
}

29
Tableau de chaînes de caractères
Accès aux différents caractères

❑ tab[i][j] permet d’accèder au caractère numéro (j+1) de la chaîne


numéro (i+1).

Modifier une composante du tableau

tab[3] = "Samia"; /* Faux */



strcpy(tab+3, "Samia"); /*Juste */

30
CONCLUSION

A l’issue de ce cours, les étudiants doivent être capables


d’aborder les aspects suivants:

❑ Code ASCII
❑ Déclaration et initialisation de chaînes
❑ Lecture/Ecriture de chaînes
❑ Utilisation de fonctions de la bibliothèque ctype.h
❑ Utilisation de fonctions de la bibliothèque string.h
❑ Utilisation de fonctions de conversion de chaînes de la
bibliothèque stdlib.h
❑ Manipulation de Tableaux de chaînes de caractères

31
Fin();

32

Vous aimerez peut-être aussi