Vous êtes sur la page 1sur 20

Murielle TORREGROSSA

LES CHAINES DE CARACTERES

IUT R. Schuman Strasbourg


R. Stutzman, M. Torregrossa

Gnralits
En langage C, une chane de caractres est
toujours stocke dans un tableau de char et
sera dsigne par le nom du tableau.

Dans un tableau de N char, on ne pourra


stocker que des chanes de caractres de
longueur infrieure ou gale N-1.
En effet, il faut toujours garder un
emplacement disponible pour le caractre fin
de chane : '\0'.

IUT R. Schuman Strasbourg


2 R. Stutzman, M. Torregrossa

Architecture des ordinateurs 1


Murielle TORREGROSSA

Gnralits
Exemple :
char str[10] ;
Le tableau de caractres str permet de stocker des chanes
de longueur <= 9 , par exemple la chane bonjour
b | o | n | j | o | u | r | \0 | |
str[0] str[9]

La chane BONJOUR peut tre stocke dans le tableau str


au moment de la dfinition du tableau :
char str [10] = { 'B', 'O', 'N', 'J', 'O', 'U', 'R', '\0 } ;
ce que l'on peut aussi crire (par quivalence)
char str [10] = "BONJOUR" ;
IUT R. Schuman Strasbourg
3 R. Stutzman, M. Torregrossa

ATTENTION
Mis part lors de la dfinition d'un tableau de char o
l'on peut crire :
char str [10] = "BONJOUR" ;
on ne peut pas affecter directement une constante de
type chane de caractres un tableau de char.
Exemple :
char str [10];
...
str = "IUT"; // FAUX !!!
En effet, la constante chane de caractres "IUT"
correspond un tableau de 4 char non explicite, et
l'affectation directe de 2 tableaux est impossible.
IUT R. Schuman Strasbourg
4 R. Stutzman, M. Torregrossa

Architecture des ordinateurs 2


Murielle TORREGROSSA

ATTENTION
Les chanes de caractres seront manipules par
l'intermdiaire de fonctions qui font partie de la
bibliothque standard des fonctions du C.
Ces fonctions et procdures sont
z strlen pour connaitre la longueur d'une chane
z strcpy pour copier une chane dans un tableau de char
z strcmp pour comparer deux chanes de caractres
z strcat pour concatner une chane la fin d'une autre chane

Les prototypes de ces fonctions se trouvent dans le


fichier string.h. Il faut rajouter #include <string.h>
chaque fois que l'on utilise ces fonctions.

IUT R. Schuman Strasbourg


5 R. Stutzman, M. Torregrossa

strlen
strlen retourne le nombre de caractres de la
chane s (caractre nul de fin de chane non
compris).

int strlen ( const char s[ ] ) {


int i = 0 ;
while( s[ i ] != '\0 )
i++ ;
return i ;
}

IUT R. Schuman Strasbourg


6 R. Stutzman, M. Torregrossa

Architecture des ordinateurs 3


Murielle TORREGROSSA

strcpy
strcpy copie la chane de caractres stocke
dans le tableau t dans le tableau s

void strcpy ( char s[ ] , const char t[ ] ) {


int i = 0;
while ( t[ i ] != '\0 ) {
s[ i ] = t[ i ] ;
i++;
}
s[ i ] = '\0 ;
}

IUT R. Schuman Strasbourg


7 R. Stutzman, M. Torregrossa

strcat
strcat copie la chane stocke dans le tableau t
la fin de la chane stocke dans le tableau s

void strcat ( char s[ ] , const char t[ ] ) {


int i = 0 , j = 0 ;
while ( s[ i ] != '\0 )
i++ ;
while ( (s[ i ] = t[ j ] ) != '\0') {
i++ ;
j++ ;
}
}
IUT R. Schuman Strasbourg
8 R. Stutzman, M. Torregrossa

Architecture des ordinateurs 4


Murielle TORREGROSSA

strcmp

strcmp compare les deux chanes stockes


respectivement dans les tableaux s et t , et
retourne :
un entier <0 , nul ou >0 selon que la chane s
est , dans l'ordre lexicographique, plus
petite, gale ou plus grande que la chane t.

IUT R. Schuman Strasbourg


9 R. Stutzman, M. Torregrossa

strcmp
int strcmp ( const char s[ ], const char t[ ] ) {
int i ,suite ;
suite = 1 ;
i=0;
while ( suite && (s[ i ] == t[ i ]) ) {
if( s[ i ] == '\0 )
suite = 0 ;
else
i++ ;
}
return s[ i ] - t[ i ] ;
}

IUT R. Schuman Strasbourg


10 R. Stutzman, M. Torregrossa

Architecture des ordinateurs 5


Murielle TORREGROSSA

Exemple : manipulation des chanes


#include <stdio.h>
#include <string.h>
main() {
char a[30] ; char b[30] ; int n ;
printf("introduire la chaine : ") ;
scanf("%s",b) ;
n = strlen(b) ;
printf("longueur de la chaine %s est %d\n", b , n) ;
strcpy(a , "IUT-");
strcat(a , "STRASBOURG");
strcat(a , "-SUD");

if ( strcmp(a , b) )
printf("\"%s\" est different de \"%s\"\n", a , b) ;
else
printf("\"%s\" est egale a \"%s\"\n", a , b) ;
}
IUT R. Schuman Strasbourg
11 R. Stutzman, M. Torregrossa

LES POINTEURS

IUT R. Schuman Strasbourg


R. Stutzman, M. Torregrossa

Architecture des ordinateurs 6


Murielle TORREGROSSA

Gnralits
Une variable de type pointeur est une variable dont la
valeur est l'adresse d'un objet.
Dfinition de variable de type pointeur :
<nom_de_type> *<nom_de_variable> ;

Exemple :
char *pc ; // pc est une variable de type pointeur de char
int *pi ; // pi est une variable de type pointeur de int
short *ps ; // ps est une variable de type pointeur de short

La valeur de la variable pc (aprs affectation) est


l'adresse d'un objet de type char.
IUT R. Schuman Strasbourg
13 R. Stutzman, M. Torregrossa

Oprateurs adresse & et contenu *


Syntaxe :
&<nom_de_variable>
La valeur de cette expression est l'adresse de la
variable. Le type de cette expression est :
pointeur de <type de la variable > .

Syntaxe:
*<expression_de_type_pointeur>
La valeur de cette expression est le contenu de
la zone mmoire adresse par l'<expression de
type pointeur>.
IUT R. Schuman Strasbourg
14 R. Stutzman, M. Torregrossa

Architecture des ordinateurs 7


Murielle TORREGROSSA

Oprateur adresse &


Exemple :
char c , *pc ;
pc = &c ; // l'adresse de la var. est stocke dans pc

Attention , les critures suivantes sont fausses:


&(x+3) &3

Exemple :
int x = 5 , y , *pi ;
pi = &x ; //pi aura pour valeur l'adresse de la variable x
x 5
pi
IUT R. Schuman Strasbourg
15 R. Stutzman, M. Torregrossa

Oprateur contenu *
Exemples :

int x = 5 , y , *pi ;
pi = &x ; /*pi aura pour valeur l'adresse de la var. x */
y = *pi + 1 ; /* la variable y aura pour valeur 6 */
*pi = 4 ; /* la variable x aura pour valeur 4 */
*pi = *pi +1; /* la variable x aura pour valeur 5 */
(*pi)++; /* la variable x aura pour valeur 6 */

IUT R. Schuman Strasbourg


16 R. Stutzman, M. Torregrossa

Architecture des ordinateurs 8


Murielle TORREGROSSA

Oprateur contenu *
Remarques :

Si p est une variable de type pointeur, les


expressions p et *p sont des "lvalue" .
Les variables p et *p peuvent tre places
gauche de l'oprateur d'affectation.

La dfinition int *pi ; ne rserve pas un


emplacement pour un entier.
La valeur de la variable pi est indtermine
aprs sa dfinition.

IUT R. Schuman Strasbourg


17 R. Stutzman, M. Torregrossa

Pointeurs et fonctions

Nous avons vu que, lorsque les paramtres


formels correspondent des variables
scalaires, l'appel se fait par valeur (pas de
modification des paramtres d'appel par la
fonction) .

IUT R. Schuman Strasbourg


18 R. Stutzman, M. Torregrossa

Architecture des ordinateurs 9


Murielle TORREGROSSA

Pointeurs et fonctions
Exemple :
main( ) {
int a = 3 , b = 5 ; // 3 b a 5
swap (a , b) ; // appel par valeur
}

void swap ( int x , int y ) {


int z ; // x 3 y 5
z=x; // puis modification
x=y; // uniquement des paramtres
y=z; // formels
}
IUT R. Schuman Strasbourg
19 R. Stutzman, M. Torregrossa

Pointeurs et fonctions

Pour que la fonction puisse modifier le


contenu des variables d'appel , on utilisera
des paramtres formels de type pointeur.

Il y a toujours appel par valeur , mais la valeur


du paramtre d'appel (&a) est une adresse
(pointeur de int).
Cette adresse est recopie dans la zone
correspondante du paramtre formel px , qui
est lui aussi de type pointeur de int.
IUT R. Schuman Strasbourg
20 R. Stutzman, M. Torregrossa

Architecture des ordinateurs 10


Murielle TORREGROSSA

Pointeurs et fonctions
Exemple :
main() {
int a = 3 , b = 5 ; // a 3 b 5
swap (&a , &b) ;
}
void swap (int *px , int *py) {
int z ; // px &a py &b
z = *px ;
*px = *py ;
*py = z ;
}
IUT R. Schuman Strasbourg
21 R. Stutzman, M. Torregrossa

Pointeurs et noms de tableaux


La dfinition : short a[10] ; correspond la
rservation de 10 emplacements mmoire
conscutifs dsigns respectivement par :
a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

Considrons les instructions suivantes :


short *pa ; // pa est une var. de type pointeur de short
pa = &a[0] ; // stocke dans pa l'adresse du 1er lment
// du tableau a
pa = &a[i] ; // stocke dans pa l'adresse de l'lment
// d'indice i du tableau a
IUT R. Schuman Strasbourg
22 R. Stutzman, M. Torregrossa

Architecture des ordinateurs 11


Murielle TORREGROSSA

Pointeurs et noms de tableaux


Dfinition :
Si la variable pa de type pointeur de short
contient l'adresse d'un lment particulier
a[i] du tableau de short a , alors:
z pa+1 "pointe" sur l'lment a[i+1] cd l'lment
suivant
z pa-1 "pointe" sur l'lment a[i-1] cd l'lment
prcdent
z pa+k "pointe" sur l'lment a[i+k] (le kme
lment aprs a[i] ).

IUT R. Schuman Strasbourg


23 R. Stutzman, M. Torregrossa

Les oprateurs + et -
Les oprateurs + ou - , avec comme
oprandes un pointeur et un entier, ne sont
pas les oprateurs + ou - ordinaires.
Ils dpendent du type de l'objet point. D'aprs
la dfinition prcdente, si pa = &a[i] ; alors
z *pa dsigne le contenu de a[i]
z *(pa+1) dsigne le contenu de a[i+1]
z *(pa+k) dsigne le contenu de a[i+k]

Il y a une correspondance trs troite entre la


notation indice et l'arithmtique des
pointeurs.
IUT R. Schuman Strasbourg
24 R. Stutzman, M. Torregrossa

Architecture des ordinateurs 12


Murielle TORREGROSSA

Les oprateurs + et -
Dfinition :

Le nom d'un tableau est une constante de type


pointeur de type gal au type des lments
du tableau.
Cette constante a pour valeur l'adresse du
premier lment du tableau. Ce n'est pas une
lvalue.

IUT R. Schuman Strasbourg


25 R. Stutzman, M. Torregrossa

Les oprateurs + et -
Exemple :
int t[20] ; // t est une constante de type pointeur de int
// gale l'adresse de t[0].
Par consquent :
z l'expression t a pour valeur l'adresse de l'lment t[0]
z l'expression t+1 a pour valeur l'adresse de l'lment t[1]
z l'expression t+i a pour valeur l'adresse de l'lment t[i]
donc :
zt +i <=> &t[i]
z *(t + i) <=> t[i]

IUT R. Schuman Strasbourg


26 R. Stutzman, M. Torregrossa

Architecture des ordinateurs 13


Murielle TORREGROSSA

Remarque 1
La mme quivalence est valable pour les
variables de type pointeur.

Exemple :
Soit :
char a[20] , *pa ;
pa = a ;

alors :
*(pa+i) <=> pa[i]
IUT R. Schuman Strasbourg
27 R. Stutzman, M. Torregrossa

Remarque 2
Considrons les dfinitions

char *pa , a[30] ;

z pa est une variable, donc pa = a et pa++ sont


des expressions correctes.

z le nom de tableau a est une constante (a dsigne


toujours l'adresse de l'lment a[0]), donc a = pa
et a++ sont des expressions fausses.

IUT R. Schuman Strasbourg


28 R. Stutzman, M. Torregrossa

Architecture des ordinateurs 14


Murielle TORREGROSSA

Remarque 3
Quand un nom de tableau est fourni comme
paramtre d'appel une fonction, c'est la
valeur de ce nom (c'est dire l'adresse du 1er
lment du tableau) qui est transmise et
stocke dans la zone correspondant au
paramtre formel (qui doit tre de type
pointeur).

La transmission des paramtres est toujours


une transmission par valeur.

IUT R. Schuman Strasbourg


29 R. Stutzman, M. Torregrossa

Exemple : Rcriture de la fonction strlen

int strlen ( char *s ) {


int i = 0 ;
while ( *(s+i) != '\0')
i++ ;
return i; s
}

main() {
char a[12] ; a I | U | T | \0 | .. |
int n ;
printf ("introduire la chaine : ") ;
scanf ("%s", a) ;
n = strlen(a) ;
printf ("longueur de la chaine : %d\n" , n) ;
}

IUT R. Schuman Strasbourg


30 R. Stutzman, M. Torregrossa

Architecture des ordinateurs 15


Murielle TORREGROSSA

Exemple : Rcriture de la fonction strlen

En appliquant l'quivalence entre notation


pointeur et notation indice *(pa+i) <=> pa[i] ,
la fonction strlen peut encore s'crire :

int strlen ( char *s ) {


int i = 0 ;
while( s[i] != '\0')
i++ ;
return i ;
}

IUT R. Schuman Strasbourg


31 R. Stutzman, M. Torregrossa

Exemple : Rcriture de la fonction strlen

Pour se rapprocher d'avantage de la notation


indice, le langage C permet de remplacer la
dfinition du paramtre formel :
int strlen ( char *s )

par l'criture quivalente suivante :


int strlen ( char s[ ] )

IUT R. Schuman Strasbourg


32 R. Stutzman, M. Torregrossa

Architecture des ordinateurs 16


Murielle TORREGROSSA

Exemple : Rcriture de la fonction strlen

La fonction strlen s'crit alors:

int strlen ( char s[ ] ) {


int i = 0 ;
while ( s[i] != '\0 )
i++ ;
return i ;
}

IUT R. Schuman Strasbourg


33 R. Stutzman, M. Torregrossa

Exemple : Rcriture de la fonction strcpy

strcpy copie la chane de caractres stocke


dans le tableau t dans le tableau s

void strcpy ( char *s, char *t) {


while ( ( *s = *t ) != '\0') {
s++ ;
t++ ;
}
}

IUT R. Schuman Strasbourg


34 R. Stutzman, M. Torregrossa

Architecture des ordinateurs 17


Murielle TORREGROSSA

Exemple : Rcriture de la fonction strcpy

Ce qui peut encore s'crire :

void strcpy ( char *s, char *t) {


while ( ( *s++ = *t++ ) != '\0') ;
}

ou encore:

void strcpy ( char *s, char *t) {


while ( *s++ = *t++ ) ;
}

IUT R. Schuman Strasbourg


35 R. Stutzman, M. Torregrossa

Constantes chane de caractres et pointeurs

L'criture dans un source C d'une constante


chane de caractres ( par exemple "abcd")
correspond une constante de type pointeur
de char non explicite dont la valeur est gale
l'adresse du premier lment d'un tableau
de char contenant la chane de caractres.

IUT R. Schuman Strasbourg


36 R. Stutzman, M. Torregrossa

Architecture des ordinateurs 18


Murielle TORREGROSSA

Constantes chane de caractres et pointeurs

Exemple 1 :

La constante "abcd" est transforme par le


compilateur en :
a b c d \0
(constante de type pointeur de char non
explicite)

IUT R. Schuman Strasbourg


37 R. Stutzman, M. Torregrossa

Constantes chane de caractres et pointeurs

Exemple 2 :
Soit :
char s[20] , *t ;
z l'instruction t = "abcd" ; est correcte
z l'instruction s = "abcd" ; est fausse
z l'instruction strcpy ( s , "abcd" ) ; est correcte
z l'instruction strcpy ( t , "abcd" ) ; est correcte
condition que la valeur de la variable t soit
gale l'adresse d'un tableau d'au moins 5 char.

IUT R. Schuman Strasbourg


38 R. Stutzman, M. Torregrossa

Architecture des ordinateurs 19


Murielle TORREGROSSA

Remarque
Le seul cas o une constante chane de caractres
n'est pas considre par le compilateur comme
un pointeur constant de type char est celui de
l'initialisation d'un tableau de char lors de sa
dfinition.

Au lieu d'crire par exemple :


char a[10] = {'I' , 'U', 'T', '\0 };
on peut crire de manire quivalente
char a[10] = "IUT";
Dans ce seul cas, "IUT" est considre comme
une numration de caractres {'I', 'U', 'T', '\0'}.
IUT R. Schuman Strasbourg
39 R. Stutzman, M. Torregrossa

Architecture des ordinateurs 20