Vous êtes sur la page 1sur 9

Chapitre 4 Les chaînes de caractères

Introduction
w Il n'existe pas de variable de type chaîne de caractères
w Une chaîne de caractères est un tableau de caractères
dont le dernier élément est le caractère invisible
NULL䇺\0䇻
Les chaînes de caractères w Ainsi une chaîne de n caractères occupe n+1 octets

1 2

Les chaînes de caractères Les chaînes de caractères


Constantes (1) Constantes (2)
w Une constante chaîne de caractères est une suite w Par exemple, la chaîne de caractères "chaîne de car" est générée
de caractères entre guillemets (" ") par le compilateur selon le schéma suivant :

w Le compilateur génère une suite d'octets terminée c h a î n e d e c a r \0


par un caractère NULL à partir des caractères contenus
dans la chaîne w Une constante chaîne de caractères n'est pas modifiable
w A la compilation, deux chaînes juxtaposées seront concaténées,
w La zone correspondante est un tableau de char
par exemple, "bon" "jour" est équivalent à "bonjour"
w La chaîne est référencée par l'adresse du tableau

3 4
Les chaînes de caractères Les chaînes de caractères
Déclaration Initialisation
w La déclaration d'une chaîne de caractères se fait w L'initialisation d’une chaîne de caractères peut se faire
comme un tableau ordinaire : à la déclaration comme :
char chaine[100]; n Pour un tableau :
char salut[10] = {䇺b䇻, 䇺o䇻, 䇺n䇻, 䇺j䇻, 䇺o䇻, 䇺u䇻, 䇺r䇻, 䇺\0䇻};
w On peut également déclarer une chaîne de caractères
comme un pointeur sur caractère : n Ou au moyen des guillemets :
char salut[10] = "bonjour";
char *chaine;
w salut contient l'adresse de début de la constante
w Il faudra alors allouer dynamiquement la taille de la chaîne chaîne "bonjour"
avant de la remplir

5 6

Les chaînes de caractères Les chaînes de caractères


Marqueur de fin de chaîne Entrées-sorties (1)
w Le caractère NULL ( 䇺 \0 䇻 ) est automatiquement w Le format à utiliser dans printf et scanf est %s :
mis en fin de chaîne dans les cas suivants : n printf("%s", ch);
n Initialisation par constante n scanf("%s", ch);
n Lecture par scanf w Le & n'est plus nécessaire car ch est déjà une adresse
n Fonctions standards w Attention, le scanf ne permet pas la saisie d'espaces
w Sinon, on peut affecter directement la valeur 䇺\0䇻 dans la chaîne
w Les espaces blancs indiquent la fin de saisie
w Bien entendu, un nombre d’octets suffisant doit avoir
été réservé auparavant
7 8
Les chaînes de caractères Les chaînes de caractères
Entrées-sorties (2) Entrées-sorties (3)
Il existe des fonctions spécifiques telles que : #include <stdio.h>
#include <string.h>
w char *gets(char *ch) pour l'entrée :
-Elle place la chaîne entrée au clavier dans le tableau de caractères ch void main()
{
-Elle remplace le caractère retour chariot par 䇺\0䇻
char str[50];
-Elle renvoie ch en cas de succès, et NULL en cas d'erreur
ou lorsque la fin du fichier se produit printf("Saisissez une chaine de caracteres : ");
gets(str);
w int puts(const char *ch) pour l'impression :
-Elle affiche à l'écran ch suivie de retour chariot printf("La chaine de caracteres saisie : ");
-Elle a pour valeur EOF en cas d'erreur ou une valeur >=0 sinon puts(str);
}

9 10

Les chaînes de caractères Les chaînes de caractères


Manipulation des chaînes Opérations sur les chaînes (1)
w Il est impossible de comparer (avec ==) deux chaînes w int strlen(const char *ch)
ou d'en affecter une à une autre, car ce sont des tableaux Retourne la longueur (le nombre de caractères) de la chaîne
( '\0' n'est pas compté)
w Il faut donc utiliser les fonctions qui se trouvent
w char *strcpy(char *dest, const char *src)
dans la librairie standard string.h, d'ou la nécessité
Copie src dans dest (ATTENTION, il n'y a pas d'allocation
de faire un lien avec le pré-processeur :
mémoire de dest !)
#include <string.h> C'est l'opération d'affectation pour les chaînes de caractères
w Toutes ces fonctions commencent par str w char *strcat(char *ch1, const char *ch2)
-Concatène ch2 à la suite de ch1
-Attention, il faut que l'emplacement réservé pour ch1
soit suffisant
11 12
Les chaînes de caractères Les chaînes de caractères
Opérations sur les chaînes (2) Opérations sur les chaînes (3)
#include <stdio.h>
#include <stdio.h>
#include <string.h>
#include <string.h>
void main()
void main()
{
{
char ch[10] = "bonjour";
char src[40];
char ch2[10];
char dest[100];
char *ch3;
strcpy(ch2, ch);
strcpy(src, "Langage C");
printf("ch2 est egale a %s\n", ch2);
printf("La longueur de \"%s\" est egale a %d.\n", src, strlen(src));
strcpy(dest, "MEC1");
strcpy(ch2, "monsieur");
printf("La longueur de \"%s\" est egale a %d.\n", dest, strlen(dest));
printf("ch2 est egale a %s\n", ch2);
strcat(dest, src);
ch3 = strcpy(ch2, "madame");
printf("La chaine \"dest\" est : %s\n", dest);
printf("ch2 est egale a %s\n", ch2);
printf("ch3 est egale a %s\n", ch3);
strcpy(dest, src);
}
printf("La chaine \"dest\" est : %s\n", dest);
} 13 14

Les chaînes de caractères Les chaînes de caractères


Opérations sur les chaînes (4) Opérations sur les chaînes (5)
Situation de départ : Situation après : strcpy(ch2, ch);

ch[0] ch[1]
ch char * ch[0] ch[1]
*ch *(ch+1) ch char *
*ch *(ch+1)
ad0 b o n j o u r \0 ad0 b o n j o u r \0
ad0 ad1 ad2
ad0 ad1 ad2
ch2 char *
ch2 char *
ad100 m a d a m e \0
ad100 b o n j o u r \0
ad100 ad101 ad102
ad100 ad101 ad102

15 16
Les chaînes de caractères Les chaînes de caractères
Opérations sur les chaînes (6) Opérations sur les chaînes (7)
Situation après : ch3 = strcpy(ch2, "madame"); w ATTENTION, on ne peut pas écrire :
ch2 = strcpy(ch2, "madame");
ch[0] ch[1]
ch char * ch2 est une lvalue (i.e. tableau), qui ne peut pas être modifiée
*ch *(ch+1)

ad0 b o n j o u r \0
ad0 ad1 ad2 w On ne peut pas non plus écrire :
ch2 char * strcpy(ch3, "madame");
ad100 m a d a m e \0 ch3 ne pointe pas sur une zone de mémoire allouée,
ad100 ad101 ad102
il n'y a donc pas de mémoire dans laquelle faire la copie
ch3 char *

ad100

17 18

Les chaînes de caractères Les chaînes de caractères


Opérations sur les chaînes (8) Opérations sur les chaînes (9)
int strcmp(const char *ch1, const char *ch2) #include <stdio.h>
#include <string.h>
w Compare les chaînes ch1 et ch2 et retourne : void main()
{
§ 0 si identiques char str1[15];
char str2[15];
§ un nombre négatif si ch1 < ch2 (ordre lexicographique) int ret;

§ un nombre positif si ch1 > ch2 (ordre lexicographique) strcpy(str1, "ABcde");


strcpy(str2, "ABCDEF");

ret = strcmp(str1, str2);

if(ret < 0)
printf("str1 < str2");
else if(ret > 0)
printf("str1 > str2");
else
printf("str1 = str2");
19 } 20
Les chaînes de caractères Les chaînes de caractères
Opérations sur les chaînes (10) Fonctions de recherche (1)
char *strncpy(char *dest, const char *source, size_t n) w char *strchr(const char *ch, int car)
char *strncat(char *ch1, const char *ch2, size_t n)
int strncmp(char *ch1, const char *ch2, size_t n) -Recherche un caractère dans la chaîne ch
-Retourne l'adresse dans la chaîne ch de la première occurrence
w Ce sont des fonctions équivalentes à strcpy, strcat de car, NULL s'il n'apparaît pas
et strcmp sauf qu'elles travaillent sur un préfixe de longueur n
w char *strrchr(const char *ch, int car)
-Recherche un caractère dans la chaîne ch
w Il existe aussi les fonctions de la bibliothèque <ctype.h>
qui manipulent les caractères : -Retourne l'adresse dans la chaîne ch de la dernière occurrence
n islower, isupper, isalpha, isdigit, isalnum, isspace, de car, NULL s'il n'apparaît pas
ispunct, tolower, toupper, ...
w char *strstr(const char *ch, const char *motif)
-Recherche une chaîne motif dans la chaîne ch
-Retourne l'adresse dans la chaîne ch du premier caractère
de la première occurrence de la chaîne motif, NULL s'il n'apparaît pas
21 22

Les chaînes de caractères Les chaînes de caractères


Fonctions de recherche (2) Fonctions de recherche (3)
#include <stdio.h>
#include <string.h> #include <stdio.h>
void main() #include <string.h>
{ void main()
char str[40] = "Programmation Langage C"; {
char *pch;
char str[40] = "Programmation et Langage C";
char c = 'r';
const char motif[10] = "et";
printf("'%c' se trouve dans \"%s\" dans les positions : \n", c, str);
char *ret;
pch=strchr(str, c);
while(pch!=NULL) ret = strstr(str, motif);
{ printf("La sous-chaine est : %s\n", ret);
printf("%d\n", pch-str+1); }
pch=strchr(pch+1, c);
}

c = 'a';
pch=strrchr(str, c);
printf("La derniere position du '%c' se trouve dans \"%s\" est %d.\n",
c, str, pch-str+1);
}
23 24
Les chaînes de caractères Les chaînes de caractères
Conversion de chaînes de caractères (1) Conversion de chaînes de caractères (2)
Utilisation de sprintf et de sscanf de <stdio.h> #include <stdio.h>
#include <string.h>
void main()
w int sprintf (char * chs, const char * format, …) {
Permet d'écrire, non plus à l'écran, mais dans une chaîne char str[80];
int n, a=5, b=3;
de caractères chs. La fonction renvoie la longueur n = sprintf(str, "%d plus %d = %d", a, b, a+b);
de la chaîne construite. printf("[%s] de taille %d\n", str, n);

w int sscanf (char * che, const char * format, …) int jour, an;
char jourSemaine[20], mois[20], date[100];
Permet de lire, non plus au clavier, mais à partir d'une chaîne
de caractères che. La fonction renvoie le nombre d'éléments strcpy(date, "Mardi 20 fevrier 2018");
de la liste d'arguments rempli avec succès; Ce nombre peut sscanf(date, "%s %d %s %d", jourSemaine, &jour, mois, &an);
correspondre au nombre attendu d'éléments ou être inférieur
(même zéro) dans le cas d'un échec. Dans le cas d'une erreur printf("%d %s %d = %s\n", jour, mois, an, jourSemaine);
}
de saisie avant de remplir la liste d’arguments, EOF est renvoyé.
25 26

Les chaînes de caractères Les chaînes de caractères


Conversion de chaînes de caractères (3) Conversion de chaînes de caractères (4)
Les fonctions de <stdlib.h> : #include <stdio.h>
#include <string.h>
#include <stdlib.h>
w double strtod(const char *chaine, char **reste)
void main()
w long strtol(const char *chaine, char **reste, int base)
{
w unsigned long strtoul(const char *chaine, char **reste, int base)
char str1[] = "365.24 29.53";
char* reste1;
-Permettent des conversions numériques d'un préfixe de chaîne double d1, d2;
(après élimination des blancs préfixes) respectivement d1 = strtod(str1, &reste1);
d2 = strtod(reste1, NULL);
en double, long et unsigned long printf("d1 =%.2f \t d2 =%.2f\n", d1, d2);
-reste pointe sur le reste de la chaîne
-base (2 à 36) est nécessaire pour les entiers char str2[30] = "2030300T1";
char* reste2;
long d3 = strtol(str2, &reste2, 10);
printf("Le numero est %ld\n", d3);
printf("La chaine est \"%s\"", reste2);
}
27 28
Les chaînes de caractères Les chaînes de caractères
Conversion de chaînes de caractères (3) Tableaux de chaînes de caractères (1)
Les anciennes fonctions conservées en C ANSI : w Soit un tableau contenant des chaînes de caractères
w Ce tableau peut être vu comme un tableau classique
n double atof(const char *) à deux dimensions :
n int atoi(const char *)
char tabmot[3][8];
n long atol(const char *)
w tabmot est un tableau de 3 lignes contenant chacune un tableau
w atof(s) équivaut à strtod(s, (char **)NULL) de 8 caractères
w atoi(s) équivaut à (int)strtol(s, (char **)NULL, 10) w C'est un tableau de 24 caractères
w atol(s) équivaut à strtol(s, (char **)NULL, 10)
w Ce tableau sera utilisé selon les mêmes règles que dans le cas
d'un tableau d'entiers

29 30

Les chaînes de caractères Les chaînes de caractères


Tableaux de chaînes de caractères (2) Tableaux de chaînes de caractères (3)
w char *tabmot[3];
tabmot est un tableau de 3 pointeurs de caractères tabmot *char[] *tabmot char * *(tabmot+1) char * *(tabmot+2) char *

ad0 ad10 ad20 ad30

w char tabmot[3][8] = {"Pascal", "C", "ADA"}; ad0


*(tabmot[2]+1)

tabmot est initialisé comme un tableau de 3 fois 8 caractères *(*(tabmot+2)+1)

A D A \0
ad30
w char *tabmot[3] = {"Pascal", "C", "ADA"};
tabmot est un tableau de char* (tableau de 3 pointeurs de caractères)
Les pointeurs sont initialisés à la valeur des adresses des constantes C \0
proposées ad20

*tabmot[0]
**tabmot

P a s c a l \0
ad10
31 32
Les chaînes de caractères
Tableaux de chaînes de caractères (4)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
main(){
char *JOUR[] = {"lundi", "mardi",
"mercredi", "jeudi", "vendredi",
"samedi", "dimanche"};
int i;
for(i=0; i<7; i++)
//printf("%s\n", JOUR[i]);
printf("%s\n", *(JOUR+i));
for(i=0; i<7; i++)
//printf("%c\t", *JOUR[i]);
printf("%c\t", *(*(JOUR+i)));
printf("\n");
for(i=0; i<7; i++)
printf("%c\t",*(JOUR[i]+2));
}
33

Vous aimerez peut-être aussi