Académique Documents
Professionnel Documents
Culture Documents
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
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
9 10
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
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
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
29 30
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