• Aucun résultat trouvé

Analyse et programmation 1

N/A
N/A
Protected

Academic year: 2022

Partager "Analyse et programmation 1"

Copied!
19
0
0

Texte intégral

(1)

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.

(2)

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"

(3)

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 ?

(4)

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";

(5)

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.

FC6BFC6AFC69FC68FC67

b 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";

(6)

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.

(7)

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[])

(8)

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

(9)

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.

(10)

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.

(11)

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

(12)

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.

(13)

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;

}

(14)

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>

(15)

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);

(16)

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

(17)

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);

(18)

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.

(19)

Vos questions

Analyse et programmation 1 - Les chaînes de caractères 36

Références

Documents relatifs

I l y a quelques années, alors que j’allais pour l’entretien  de  mon  auto,  le  garagiste  m’a  proposé  de  vérifier  la  transmission.  Comme  mon 

Domaine de collision est une zone logique d'un réseau informatique où les paquets de données peuvent entrer en collision entre eux, en particulier avec le protocole de

Et bientôt, selon une évolution parallèle à celle de Nietz- sche, l'indépendance à l'égard de la vengeance contre les hom- mes va devenir aussi indépendance à l'égard du

Réalisez une fonction int test_chiffre(char* p) qui, en supposant que p pointe un caractère situé dans une chaîne de caractères, retourne la valeur vrai (1) si le caractère

GtkWidget* gtk_label_new(const gchar* str); crée un objet GtkLabel de libellé str void gtk_label_set_label(GtkLabel* label, const gchar* str); affecte le libellé str au label

Dénir int* tabFitness dans le main, qui recupère les valeurs calculées dans

Renseignez votre adresse mail, un nom d’utilisateur qui vous permettra d’accéder au portail (nous vous conseillons de reprendre par simplicité celui fourni dans le

- Je n’avais pas réfléchi à cet artéfact lors de notre vie à deux… C’est bien plus tard, à l’aune d’une problématique face à un challengeur mage… Une