Analyse et programmation 1
Les chaînes de caractères
Thèmes abordés
• Applications Défi iti
• Définition
– Création de chaînes de caractères en C.
– Les constantes.
• Manipulation de chaînes de caractères
– Programmation des opérations de base
• Quelques fonctions de la bibliothèque standard.
Les chaînes de caractères (string)
Applications
• Informations de type textuel
Noms de personnes : – Noms de personnes :
• "Jean de La Fontaine"
– Descriptions de produits, références, immatriculations :
• "Pack 12 piles alcalines super longue durée"
• "VD-12030"
– Logiciels de traitement de texte
• "Maître Corbeau, sur un arbre perché, tenait en son bec un fromage."
Analyse et programmation 1 - Les chaînes de caractères 2
• "Les chaînes de caractères (string) - Applications"
– Transformation de texte
• Logiciel de traduction Anglais <-> Français.
• Compilateur : texte en C -> programme compilé.
Les chaînes de caractères (string)
Applications
• Communication avec des systèmes externes
Base de données langage SQL – Base de données – langage SQL
• "SELECT NOM, PRENOM, REFERENCE FROM CLIENTS"
– Périphériques intelligents. Ex: station météo
• "P=950;T=18;H=80" : 950 hPa, 18 °C, 80 % humidité.
– Commande de robot industriel
• "MOVE X=30, Y=40.5, Z=25"
Les chaînes de caractères
Définition
• Langage C :
Pas de t pe partic lier po r les chaînes de caractères – Pas de type particulier pour les chaînes de caractères.
• Pratique usuelle :
– Utilisation de tableaux de caractères.
• Exemples
char texte1[80];
char texte2[40];
printf("%d\n" sizeof(texte1)); // Affiche 80
Analyse et programmation 1 - Les chaînes de caractères 4
printf( %d\n , sizeof(texte1)); // Affiche 80
Les chaînes de caractères
Constantes
• Exemples
char texte3[] = "Maître Corbeau ";
char texte3[] = Maître Corbeau, ;
char texte4[32] = "sur un arbre perché\n";
char texte5[40] = { 'T', 'e', 'n', 'a', 'i', 't', ' ', 'e', 'n', ' ', 's', 'o', 'n', ' ', 'b' , 'e', 'c', '\0' };
printf("%d\n", sizeof(texte3));
printf("%d\n", sizeof(texte4));
printf("%d\n", sizeof(texte5));
// Affiche 16 // Affiche 32 // Affiche 40
• Comment la fonction printf repère-t-elle la fin du texte ?
Les chaînes de caractères
Utilisation
• Exemples
char texte3[] = "Maître Corbeau ";
char texte3[] = Maître Corbeau, ;
char texte4[32] = "sur un arbre perché\n";
char texte5[40] = { 'T', 'e', 'n', 'a', 'i', 't', ' ', 'e', 'n', ' ', 's', 'o', 'n', ' ', 'b' , 'e', 'c', '\0' };
printf(texte3);
printf(texte4);
printf(texte5);
// Affiche: Maître Corbeau, // Affiche: sur un arbre perché // Affiche: Tenait en son bec
Analyse et programmation 1 - Les chaînes de caractères 6
• Comment la fonction printf repère-t-elle la fin du texte ?
Les chaînes de caractères
Analyse du contenu de la mémoire
• Représentation en mémoire
char texte3[] = "Maître Corbeau ";
char texte3[] = Maître Corbeau, ;
char texte4[32] = "sur un arbre perché\n";
Les chaînes de caractères
Représentation du texte en mémoire
• En mémoire, les chaînes de caractères
Sont stockées so s la forme d’ ne s ite de FC63FC62
î
FC60
M
FC61
a
– Sont stockées sous la forme d’une suite de caractères.
– Ils sont placés à des adresses consécutives.
– La fin de la chaîne de caractères est identifiée par un caractère de code ASCII 0.
• Une chaîne de caractères peut être très
longue.
FC6BFC6AFC69FC68FC67b o C r
FC66
e
FC65
r
FC64
t
FC63
Analyse et programmation 1 - Les chaînes de caractères 8
g
FC6D
a
FC6C
e
FC6B
FC6E
u
FC6F
,
\0
Les chaînes de caractères
Constantes multi-lignes longues avec caractères spéciaux.
char fable[] =
"Maître Corbeau, sur un arbre perché,\n"
"Tenait en son bec un fromage.\n"Tenait en son bec un fromage.\n
"Maître Renard, par l'odeur alléché,\n"
"Lui tint à peu près ce langage :\n"
"\"Hé ! bonjour, Monsieur du Corbeau.\n"
"Que vous êtes joli ! que vous me semblez beau !\n"
"Sans mentir, si votre ramage\n"
"Se rapporte à votre plumage,\n"
"Vous êtes le Phénix des hôtes de ces bois.\"\n"
"A ces mots le Corbeau ne se sent pas de joie ;\n"
"Et pour montrer sa belle voix,\n"
"Il ouvre un large bec, laisse tomber sa proie.\n"
"Le Renard s'en saisit et dit : \"Mon bon Monsieur \n"
"Le Renard s'en saisit, et dit : \"Mon bon Monsieur,\n"
"Apprenez que tout flatteur\n"
"Vit aux dépens de celui qui l'écoute :\n"
"Cette leçon vaut bien un fromage, sans doute. \"\n"
"Le Corbeau, honteux et confus,\n"
"Jura, mais un peu tard, qu'on ne l'y prendrait plus. \n";
Les chaînes de caractères
Bien les dimensionner
• Quelle taille faut il donner à un tableau devant accepter une chaîne comportant jusqu’à 80 caractères
une chaîne comportant jusqu à 80 caractères imprimables ?
char ligne[81];
• Que se passe-t-il si on place plus de 80 caractères dans
Analyse et programmation 1 - Les chaînes de caractères 10
Que se passe t il si on place plus de 80 caractères dans ce tableau ?
Passage de chaîne de caractères en paramètre
Principe
• Convention en C
Les mêmes q e po r les tablea – Les mêmes que pour les tableaux.
– On passe seulement l’adresse du tableau (premier caractère).
– La suite de la chaîne peut être trouvée facilement en incrémentant l’adresse, jusqu’au caractère de code 0.
– C’est ainsi que fonctionne printf.
Passage de chaîne de caractères en paramètre
Principe
• Paramètres chaînes de caractères constantes
On tilise : – On utilise :
const char * const char nom[]
– const:
• Dénote qu’on ne peut pas modifier les caractères.
• Pas obligatoire.
• Mais recommandé lorsque la chaîne passée est constante.
P è h î d è NON
Analyse et programmation 1 - Les chaînes de caractères 12
• Paramètres chaînes de caractères NON constantes
– On utilise :
char * char nom[]
• A utiliser lorsque la chaîne est modifiée par la fonction.
Passage de chaîne de caractères en paramètre
Illustration
void afficher_fable(const char* titre, const char * texte) {
printf("***************************************************\n");
printf( \n );
printf(titre);
printf("\n");
printf("***************************************************\n");
printf(texte);
printf("\n");
printf("***************************************************\n");
}
int main() {
afficher fable("Le Corbeau et le Renard" fable);
afficher_fable("Le Corbeau et le Renard", fable);
system("PAUSE");
return 0;
}
// Autre forme possible :
void afficher_fable(const chartitre[], const char texte[])
Entrées sorties
Affichage de chaînes de caractères
• Rappel – fonction printf
– Le premier paramètre est une chaîne de caractères – Le premier paramètre est une chaîne de caractères.
– Cette chaîne peut être une constante ou une variable.
• Affichage de chaînes avec les options de format
– Utiliser %s.
– Options de formatage à gauche et à droite.
char * auteur = "Jean de la Fontaine";
printf("**********************************\n");
printf("* % 30s *\n" auteur);
Analyse et programmation 1 - Les chaînes de caractères 14
printf("* %-30s *\n", auteur);
printf("**********************************\n");
– Résultat:
**********************************
* Jean de la Fontaine *
**********************************
Entrées sorties
Affichage de chaînes de caractères – autres fonctions
• La fonction puts
– Permet d’afficher une chaîne de caractères – Permet d afficher une chaîne de caractères.
– Pas de possibilités de formatage.
– Fait automatiquement un saut de ligne à la fin.
• Exemple
char * auteur = "Jean de la Fontaine";
puts("**********************************");
puts(auteur);
puts("**********************************");
puts( ********************************** );
• Résultat
Entrées sorties
Saisie de chaînes de caractères - scanf
int main() {
char * reference_article;
char reference_article[80];
printf("Reference article:");
scanf("%s", reference_article);
printf("Article choisi : %s\n", reference_article);
system("PAUSE");
Quelle déclaration est
correcte ?
Analyse et programmation 1 - Les chaînes de caractères 16
y ( );
return 0;
}
Entrées sorties
Saisie de chaînes de caractères - scanf
• Test
• Observation
– scanf saisit le texte jusqu’au premier séparateurscanf saisit le texte jusqu au premier séparateur
• Espace ou saut de ligne.
– scanf inutilisable pour saisir une ligne de texte complète.
– Adapté pour saisir un texte mot par mot.
Entrées sorties
Saisie de chaînes de caractères - gets
• Prototype
char *gets(char *buffer);
• Fonctionnement
– Saisit la ligne entière et la place dans buffer.
– Renvoie buffer en cas de succès. (NULL sinon).
• Exemple int main() {
char reference_article[80];
Analyse et programmation 1 - Les chaînes de caractères 18
printf("Reference article:");
gets(reference_article);
printf("Article choisi : %s\n", reference_article);
system("PAUSE");
return 0;
}
Entrées sorties
Saisie de chaînes de caractères - gets
• Test
• Observation
– gets saisit le texte jusqu’à la fin de la lignegets saisit le texte jusqu à la fin de la ligne – Utilisable pour saisir une ligne de texte complète.
Tableaux de chaînes de caractères
Illustration
int main() {
int i choix;
int i, choix;
char * COLLECTION_DVD[] = {
"War games",
"NetForce",
"Les pirates de la Silicon Valley",
"Shortcut" };
const int TAILLE_COLLECTION_DVD = sizeof(COLLECTION_DVD) / sizeof(char *);
puts("Selection dans notre catalogue DVD");
for (i = 0; i < TAILLE_COLLECTION_DVD; i++)
Analyse et programmation 1 - Les chaînes de caractères 20
printf("%d - %s\n", i, COLLECTION_DVD[i]);
printf("Choix>");
scanf("%d", &choix);
system("PAUSE");
return 0;
}
Tableaux de chaînes de caractères
Deux modèles différents
char COLLECTION_DVD[][40] = {
"War games",
"NetForce",
"L i t d l Sili V ll "
char* COLLECTION_DVD[] = {
"War games",
"Les pirates de la Silicon Valley",
"Shortcut" };
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
W a r g a m e \0 N e t F o r c e \0
L e s p i r a t e s d e l a S i l i c o n V a l l e y \0 S h o r t c u t \0
0 1 2 3
"NetForce",
"Les pirates de la Silicon Valley",
"Shortcut"};
0 12 3 4 5 6 7 8
W a r g a m e \0
01 2 3 4 5 6 7 8
N e t F o r c e \0
0 1 2 3 45 6 7 8
S h o r t c u t \0
0 1 2 3 4 5 6 7 8 910 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
L e s p i r a t e s d e l a S i l i c o n V a l l e y \0
Opérations sur les chaînes de caractères
Opérations standards du langage C
• Peu d’opérations disponibles sur les chaînes en C:
Se lement les opérations disponibles s r les tablea – Seulement les opérations disponibles sur les tableaux.
– Accès à un caractère []
– Même l’affectation n’est pas disponible !
• Constat
– Très insuffisant pour traiter des problèmes avec des chaînes de caractères.
Analyse et programmation 1 - Les chaînes de caractères 22
Opérations sur les chaînes de caractères
Opérations souhaitables
• Copie (affectation).
L
• Longueur.
• Extraire une partie.
• Concaténer plusieurs chaînes.
• Comparer des chaînes pour les trier.
• Position d’un caractère, d’une sous chaîne.
• Remplacer une sous chaîne
• Remplacer une sous-chaîne.
Opérations sur les chaînes de caractères
Programmer des opérations sur les chaînes – calcul de la longueur
• Possibilité : créer les fonctions dont nous avons besoin.
• Exemple : longueur d’une chaîne.Exemple : longueur d une chaîne.
int chaine_longueur(const charchaine[]) {
int i;
i = 0;
while (chaine[i] != '\0') i++;
return i;
}
Analyse et programmation 1 - Les chaînes de caractères 24
int main() {
printf("%d\n", chaine_longueur("Test"));
system("PAUSE");
return 0;
}
Opérations sur les chaînes de caractères
Programmer des opérations sur les chaînes – copie
void chaine_copier(char destination[], const char source[]) {
int i;
int i;
i = 0;
while (source[i] != '\0') {
destination[i] = source[i];
i++;
}
destination[i] = '\0';
}
int main() {
{
char destination[80];
chaine_copier(destination, "Test");
puts(destination);
system("PAUSE");
return 0;
}
Opérations sur les chaînes de caractères
Programmer des opérations sur les chaînes – concaténation
voidchaine_concatener(char destination[], const charsource[]) {
int i, j;
i = chaine_longueur(destination);
j = 0;
while (source[j] != '\0') {
destination[i] = source[j];
i++;
j++;
}
destination[i] = '\0';
}
intmain() {
Analyse et programmation 1 - Les chaînes de caractères 26
{
char destination[80];
chaine_copier(destination, "Test");
chaine_concatener(destination, "1234");
puts(destination);
system("PAUSE");
return 0;
}
Opérations sur les chaînes de caractères
Les fonctions standards de string.h
• Les opérations sur les chaînes sont très courantes.
Il serait abs rde q e chaq e programme r doi e les – Il serait absurde que chaque programmeur doive les
reprogrammer.
– Il existe une bibliothèque de fonctions standards sur les chaînes de caractères :
#include <string.h>
Opérations sur les chaînes de caractères
Les fonctions standards de string.h – longueur et copie
• Longueur d’une chaîne
size t strlen(const char* str);
size_t strlen(const char* str);
• Copie
– Simple
char* strcpy(char* strDest, const char* strSource);
– Avec limitation de la taille de la destination
char* strncpy(char* strDest, const char* strSource, size_t count);
Analyse et programmation 1 - Les chaînes de caractères 28
• Si la destination est remplie, le ‘\0’ terminal n’est pas placé ! – Possibilité de chaînage des appels
• Les fonctions strcpy retournent le paramètre strDest.
strcpy(dest2, strcpy(dest1, source));
Opérations sur les chaînes de caractères
Les fonctions standards de string.h - Concaténation
• Concaténation
Simple – Simple
char* strcat(char* strDest, const char* strSource);
– Avec limitation de la taille de la destination
char* strncat(char* strDest, const char* strSource, size_t count);
– Possibilité de chaînage des appels
• Les fonctions strcat retournent le paramètre strDest.
( (d 1) 2)
strcat(strcat(dest, source1), source2);
Opérations sur les chaînes de caractères
Les fonctions standards de string.h - Comparaison
• Comparaison
Simple – Simple
int strcmp(const char * string1, const char * string2);
– Avec limitation de la taille utilisée
int strncmp(const char* string1, const char* string2, size_t count);
– Comparaison caractère par caractère des valeurs numériques des caractères
Analyse et programmation 1 - Les chaînes de caractères 30
caractères.
– Résultat
• 0 si les chaînes sont identiques.
• < 0 si string1 < string2
• >0 si string2 > string1
Opérations sur les chaînes de caractères
Les fonctions standards de string.h – Comparaison insensible maj/min
• Comparaison insensible aux majuscules et minuscules
Simple – Simple
int stricmp(const char * string1, const char * string2);
– Avec limitation de la taille utilisée
int strnicmp(const char* string1, const char* string2, size_t count);
– Comparaison caractère par caractère des valeurs numériques des caractères indépendamment des majuscules et minuscules caractères, indépendamment des majuscules et minuscules.
– Résultat
Opérations sur les chaînes de caractères
Les fonctions standards de string.h - Comparaison
string1 string2 strcmp stricmp
"Chat" "Chat" 0 0
"Chat" " Chat" 1 67
"Chat" "Chien" -1 -8
Analyse et programmation 1 - Les chaînes de caractères 32
"Chat" "Chat siamois" -1 -32
"Chat" "CHAT" 1 0
Opérations sur les chaînes de caractères
Les fonctions standards de string.h – Recherche
// retourne l'adresse de la première occurence d'un caractère dans une chaine char* strchr(const char* str, int c);
// retourne l'adresse de la première occurence d'un caractère // dans une chaine en partant de la droite
char* strrchr(const char* str, int c);
// retourne l'indice de la première occurence dans une chaine d'un caractère // pris dans un ensemble
size_t strcspn(const char* str, const char* strCharSet);
// retourne l'indice de la première occurence dans une chaine d'un caractère // ne figurant pas dans un ensemble
size_t strspn(const char* str, const char* strCharSet);
// retourne l'adresse de la première occurence dans une chaine d'un caractère // retourne l adresse de la première occurence dans une chaine d un caractère // pris dans un ensemble
char* strpbrk(const char* str, const char* strCharSet);
// retourne l'adresse de la première occurence d'une sous chaîne dans une chaîne char* strstr(const char* str, const char* strSearch);
// découpe une chaîne en jetons selon des délimiteurs char* strtok(char* strToken, const char* strDelimit);
Opérations sur les chaînes de caractères
Fonctions utiles de stdio.h
• stdio apporte des fonctions travaillant avec des chaînes :
sprintf – sprintf
• identique à printf, mais écrit dans une chaîne au lieu de l’écran.
– sscanf
• identique à scanf, mais lit depuis une chaîne au lieu du clavier.
• Exemples
double tension, courant;
char source[] = "3.2 4.7";
Analyse et programmation 1 - Les chaînes de caractères 34
char source[] 3.2 4.7 ; char destination[80];
sscanf(source, "%lf%lf", &tension, &courant);
sprintf(destination, "Tension : %3.2f", 4.5);
Qu’avons-nous appris ?
• Les chaînes : des tableaux de caractères.
Att ti déb d t
• Attention aux débordements.
• Les constantes chaînes de caractère.
• Afficher et saisir des chaînes de caractères.
• Comment écrire des fonctions exploitant les chaînes.
• Les fonctions standards de la bibliothèque C.
Vos questions
Analyse et programmation 1 - Les chaînes de caractères 36