You are on page 1of 8

Programmation C

Chaînes de caractères Entrées-sorties
David Pointcheval

Plan

1 - Chaînes de Caractères
– structure – fonctions

2 - Fichiers

E-mail : David.Pointcheval@ens.fr Web : http://www.di.ens.fr/~pointche/enseignement/ensta

David Pointcheval LIENS - CNRS

Programmation C - ENSTA - 2

Types de Base
Les types de base sont • pour les entiers
– short – int – long – long long – char (pour coder les caractères) – float – double – long double
David Pointcheval LIENS - CNRS Programmation C - ENSTA - 3 David Pointcheval LIENS - CNRS

Tableaux
Les tableaux permettent • de définir sous un nom unique un groupe d’objets de même type • d’accéder à chaque objet par sa position dans le tableau - « Qu’est-ce qu’une chaîne de caractères ? » - un tableau de caractères
Programmation C - ENSTA - 4

• pour les flottants

Chaîne de Caractères
Le type ‘chaîne de caractères’ n’existe pas en C (string en java), il s’agit donc d’un tableau de caractères : char mot[16]; pour déclarer une chaîne de 16 caractères

Codage des Chaînes
Tableau classique ? Non: • affectation particulière : char mot[8] = “toto”; • nombre effectif de cases connu : le caractère ’\0’ désigne la fin
mot

mot


David Pointcheval LIENS - CNRS


Programmation C - ENSTA - 5 David Pointcheval LIENS - CNRS

’t’ ’o’ ’t’ ’o’ ’\0’


Programmation C - ENSTA - 6

Longueur d’une Chaîne
La chaîne déclarée par char mot[8]; peut stocker 8 caractères, dont ’\0’ ⇒ un mot d’au plus 7 caractères Longueur effective : jusqu’au caractère ’\0’
mot

Allocation Dynamique
Un tableau est un pointeur : une chaîne de caractère est un pointeur sur un caractère char *mot; Allocation :
mot = malloc(8*sizeof(char));
mot


David Pointcheval LIENS - CNRS

’t’ ’o’ ’t’ ’o’ ’\0’


Programmation C - ENSTA - 7 David Pointcheval LIENS - CNRS


Programmation C - ENSTA - 8

Tableau = Pointeur
Ainsi char mot[] ≈ char *mot : mot est une variable qui pointe sur une chaîne de caractères (éventuellement nulle, si non allouée) De même, char **t ≈ char *t[]: tableau de chaînes de caractères (cf. char *argv[])
David Pointcheval LIENS - CNRS Programmation C - ENSTA - 9

Fonctions Spécifiques
Des fonctions spécifiques existent pour manipuler ces tableaux particuliers. Leurs prototypes sont décrits dans string.h
strlen strcmp strcpy strcat strdup …

Pour des informations, ne pas hésiter à consulter le man : man strlen
David Pointcheval LIENS - CNRS Programmation C - ENSTA - 10

Fonction strlen
Comme on l’a vu, contrairement aux tableaux classiques, une chaîne de caractères stocke implicitement sa longueur effective (le caractère ’0’ désigne la fin du mot) ⇒ il est possible de connaître cette longueur : la fonction int strlen(char *s)
David Pointcheval LIENS - CNRS Programmation C - ENSTA - 11

Fonction strlen
strlen(chaine) retourne le nombre de caractères avant le caractère de fin ’\0’ Ainsi, strlen(mot) retourne 4

mot


David Pointcheval LIENS - CNRS

’t’ ’o’ ’t’ ’o’ ’\0’


Programmation C - ENSTA - 12

Fonction strcmp
Il est possible de comparer deux mots : cependant, par exemple, le test (mot1 == mot2) char mot1[10] = “toto”; compare les pointeurs char mot2[10] = “tata”; if (mot1 == mot2) mot1 et mot2, printf(“égalité\n pas les contenus en tant ”); que chaîne de caractères.
int strcmp(char *s1, char *s2)
David Pointcheval LIENS - CNRS Programmation C - ENSTA - 13

Fonction strcmp
int strcmp(char *s1, char *s2) La fonction strcmp(mot1,mot2) compare les chaînes pointées par mot1 et mot2 selon l’ordre lexicographique (alphabétique), Sachant que l’ordre sur chaque caractère suit le code ASCII (comparaison de la représentation entière du caractère) : ’4’ < ’A’ < ’H’ < ’b’ < ’z’
David Pointcheval LIENS - CNRS Programmation C - ENSTA - 14

Fonction strcmp
t = strcmp(mot1, mot2)

Fonction strncmp
int strncmp(char *s1,char *s2,int l) La fonction strncmp(mot1,mot2,3) compare les chaînes pointées par mot1 et mot2 en ne considérant que les 3 premières lettres de mot1.
David Pointcheval LIENS - CNRS

mot1 mot1 mot1

< = >

mot2 ⇔ t mot2 ⇔ t mot2 ⇔ t

< = >

0 0 0

David Pointcheval LIENS - CNRS

Programmation C - ENSTA - 15

Programmation C - ENSTA - 16

Chaînes Constantes
Pour ces trois fonctions, strlen, strcmp et srtncmp, les chaînes passées en argument peuvent être des constantes : strcmp(“toto”,“tata”) retournera un entier strictement positif
David Pointcheval LIENS - CNRS Programmation C - ENSTA - 17

Fonction strcpy
Il est possible de copier un mot : cependant, par exemple, l’affectation mot1 = mot2 ne remplit pas la chaîne char mot1[10]; char mot2[10] = “toto”; mot1 avec le contenu mot1 = mot2; de mot2, mais affecte le pointeur mot1 avec la valeur mot2 char* strcpy(char *s1, char *s2)
David Pointcheval LIENS - CNRS Programmation C - ENSTA - 18

Fonction strcpy
char* strcpy(char *s1, char *s2) La fonction strcpy(mot1,mot2) remplit le tableau alloué mot1 avec le contenu de mot2 (y compris ’\0’) ⇒ il faut que la chaîne mot1 soit allouée, avec une taille suffisante Elle retourne un pointeur sur la première chaîne (la seconde pouvant être constante)
Programmation C - ENSTA - 19

Fonction strncpy
char* strncpy(char *s1,char *s2,int l) La fonction strncpy(mot1,mot2,n) remplit le tableau alloué mot1 avec les (au plus) n premiers caractères de mot2 Mais n’introduit pas de ‘\0’ si absent dans les n caractères de mot2 ⇒ ca permet de contrôler le nombre de caractères copiés
David Pointcheval LIENS - CNRS Programmation C - ENSTA - 20

(sinon n’ n’importe quoi peu se passer : cf. hackers et buffer overflow) overflow)

David Pointcheval LIENS - CNRS

Fonctions strcat, strncat
char* strcat(char *s1,char *s2) char* strncat(char *s1,char *s2,int l) La fonction strcat(mot1,mot2) concatène le contenu de mot2 à mot1 ⇒ il faut la place nécessaire à la fin de mot1 La fonction strncat(mot1,mot2,n) fait de même avec seulement les n premiers caractères de mot2 Elle retourne un pointeur sur la première chaîne (la seconde pouvant être constante)
David Pointcheval LIENS - CNRS Programmation C - ENSTA - 21

Fonction strdup
char* strdup(char *s) La fonction strdup(mot) • alloue une chaîne de caractères de la taille de mot (à l’aide de malloc) • la remplit avec le contenu de mot • retourne un pointeur sur cette chaîne ⇒ très pratique : allocation et affectation d’une copie
Programmation C - ENSTA - 22

(ou le pointeur NULL si mémoire insuffisante)

David Pointcheval LIENS - CNRS

Fonctions printf, scanf
printf(“%s”,mot); Affichage du contenu de la chaîne mot scanf(“%s”,mot); Scannage d’un mot (avant le prochain espace) qui est stocké dans la chaîne mot Cette chaîne doit être allouée de taille suffisante.
David Pointcheval LIENS - CNRS Programmation C - ENSTA - 23

Les Fichiers en C
Un fichier est identifié par un flux de type FILE * Trois flux standard existent • stdin : l’entrée standard, le clavier • stdout : la sortie standard, l’écran • stderr : la sortie des erreurs standard, l’écran ouvert en écriture Mais il est possible d’en créer des nouveaux, reliés à des fichiers
Programmation C - ENSTA - 24

ouvert en lecture

ouvert en écriture

David Pointcheval LIENS - CNRS

La Création d’un Flux
FILE *fopen(char *path,char *mode) f = fopen(“toto”,“r”)
crée un nouveau flux, en lecture, sur le fichier toto (dans le répertoire courant)

Lecture - Écriture
int fprintf(FILE *F,char *s,…) int fscanf(FILE *F,char *s,…) fprintf fonctionne comme printf en précisant le flux (et non sur stdout) ⇒ retourne le nombre de variables affichées fscanf fonctionne comme scanf en précisant le flux (et non sur stdin) ⇒ retourne le nombre de variables scannées
David Pointcheval LIENS - CNRS Programmation C - ENSTA - 26

f = fopen(“toto”,“w”)
crée un nouveau flux, en écriture crée (ou recrée) le fichier toto vide

f = fopen(“toto”,“a”)
crée un nouveau flux, en écriture ouvre (ou crée vide) le fichier toto avec le curseur en fin de fichier
David Pointcheval LIENS - CNRS Programmation C - ENSTA - 25

Lecture - Écriture de Caractères
int fputc(char c,FILE *F) char fgetc(FILE *F) fputc(c,F) écrit c dans le flux F à la position du curseur, et avance le curseur d’un cran fgetc(F) lit et retourne le caractère sous le curseur, et avance le curseur d’un cran
David Pointcheval LIENS - CNRS Programmation C - ENSTA - 27

Manipulation du Flux
FILE *fopen(char *path,char *mode)
ouvre un nouveau flux

int feof(FILE *f)
teste si le curseur a franchi la fin de fichier et retourne : 0 pour faux et non nul pour vrai

void rewind(FILE *f)
réinitialise le curseur en tête de fichier

int fclose(FILE *f)
ferme le flux (le nombre de flux ouverts est limité)
David Pointcheval LIENS - CNRS Programmation C - ENSTA - 28

Conclusion
Les chaînes de caractères sont des tableaux particuliers : • déclaration et allocation d’un tableau de caractères • fonctions spécifiques pour ces tableaux de caractères Les fichiers se manipulent comme stdin et stdout (avec fprintf et fscanf) cf. polycopié/TP pour des exemples
Programmation C - ENSTA - 29

David Pointcheval LIENS - CNRS