Langage C Prof. Asmaa EL HANNANI 2015/2016 Informations pratiques Cours: Salle (C1), site ENSAJ Rahhal ERRATTAHI r.errattahi@gmail.com TP: salle de TP, site ENSAJ Mme Fatima zahra SALMAM Matériel du cours et exercices sous: http://ensaj.ac.ma/elhannani (Anglet Teaching) Prof Asmaa El Hannani 2AP-S3 2 Organisation 2 heures de cours Transparents Publication des supports sur le site (username et password communiqués en classe) 2 heures de TD/TP Correction du TP/TD précédent, explication du TP/TD courant, travail sur PC Prof Asmaa El Hannani 2AP-S3 3 Evaluation Contrôles continus Evaluation des TPs 1 Examen écrit Prof Asmaa El Hannani 2AP-S3 4 Objectifs du module Appréhender le langage C. Apprendre à traduire un algorithme dans le langage de programmation C pour produire un programme exécutable. Prof Asmaa El Hannani 2AP-S3 5 Références bibliographiques: Programmer en langage C, Stephen Kochan, ISBN : 2-744-07081-5 Programmer en langage C, Claude Delannoy, ISBN : 2-212-11072-3 Le livre du C premier langage, Claude Delannoy, ISBN : 2-212-11052-9 Prof Asmaa El Hannani 2AP-S3 6 Références webographiques: http://c.developpez.com/cours http://www.commentcamarche.net/contents/c/ Prof Asmaa El Hannani 2AP-S3 7 Partie 1 LES BASES DU LANGAGE C Prof Asmaa El Hannani 2AP-S3 8 Introduction Histoire du C Origines C a trois ancêtres : les langages CPL, BCPL et B. CPL : (pour Combined Programming Language) a été conçu au début des années 1960 - universités de Cambridge et de Londres. Fortement typé mais trop complexe disparition dans las année 70 BCPL: (pour Basic CPL) Cambridge en 1966 par Martin Richards. Version siplifiée Ecriture d’un 1er Compilateur et de divers systèmes d’exploitations B: Ken Thompson vers 1970 dans les laboratoires Bell Version simplifiée du BCPL Prof Asmaa El Hannani 2AP-S3 10 Histoire du C Le C à été éveloppé par un collègue de Ken Thompson, Dennis Ritchie en 1972 qui ajouta les tableaux, les pointeurs, les nombres à virgule flottante, les structures... En 1973, C fut suffisamment au point pour que 90% de UNIX puisse être récrit avec. Une 1ère définition du langage est apparue en 1978 avec l’ouvrage de Ritchie et Kernighan « The C programming language ». Son succès international a contribué à sa normalisation: 1. ANSI (American National Standard Institute) 2. ISO (International Standadization Organisation) 3. CEN (Comité Européen de Normalisation) en 1993 Prof Asmaa El Hannani 2AP-S3 11 Introduction au langage C Le langage C est un langage de bas niveaux, dans le sens où il permet la manipulation de données que manipulent les ordinateurs (Bit, octet, adresse) ≠ Langages évolués (Pascal, Fortran, ADA) Il est suffisamment général pour permettre de développer des application de type scientifique ou de gestion basée sur l’accès aux bases de données (Word et Excel sont écrits à partir de C ou C++) Il est un des 1ers langages offrant des possibilités de programmation modulaire: Un programme peut être constitué de plusieurs module (module = fichier .c) Prof Asmaa El Hannani 2AP-S3 12 Classification du langage C Tous les Languages de Programmation Languages Imperatifs Programmation Procedurale Ada, Pascal, C Prof Asmaa El Hannani Programmation Orientee Objets C++, Java Languages Declaratifs Programmation Programmation Programmation Concurrente Fonctionelle Logique Ada 95 LISP, SCHEME PROLOG 2AP-S3 13 Qu’est ce qu’un programme C? C’est un texte écrit avec un éditeur de texte, respectant une certaine syntaxe et stocké sous forme d'un ou plusieurs fichiers (avec l'extension .c). A l'opposé du langage assembleur, les instructions du langage C sont obligatoirement encapsulées dans des fonctions et il existe une fonction privilégiée appelée main qui est le point de départ de tout programme. Exemple: main() { printf(’’Bonjour!’’); } Source.c Compilation Prof Asmaa El Hannani Objet.o 2AP-S3 Edition des liens Exécutable 14 Phases d’élaboration d’un programme C L’élaboration d’un programme C passe par 4 phases : 1. Edition du code source: Cette phase consiste à écrire le code du programme C en utilisant un éditeur de texte. Ce code est enregistrer dans un fichier texte d’extension « .c». 2. Traitement du pré-processeur : Consiste à préparer la phase de compilation en effectuant les transformations textuelles , dans le code source, suivantes : L’inclusion de code source (fichiers en-tête (Header) « .h ») : #include La compilation conditionnelle : #if … #else Le traitement de macros : #define Prof Asmaa El Hannani 2AP-S3 #end if 15 Phases d’élaboration d’un programme C 3. Compilation: Consiste à traduire le code généré par le pré-processeur en langage machine. Le résultat de compilation porte le nom de module objet (fichier.obj). Ce module objet n'est pas directement exécutable. 4. Édition de liens: Produit, à partir d'un ou de plusieurs fichiers objets et des bibliothèques standards, un fichier exécutable (fichier.exe). Outre l'assemblage des divers fichiers objets, l'édition des liens inclut les définitions des fonctions prédéfinies utilisées par le programme. Prof Asmaa El Hannani 2AP-S3 16 conio.h /* conio.h */ . . . Fichier2.c graphics.h /* graphics.h */ . . . #include<conio.h> #include<graphics.h> … main() { … } Fichier1.c #include<stdio.h> #include<maths.h> … Calcul() { … } math.h stdio.h /* conio.h */ . . . /* math.h */ . . . Pré-processeur Fichier2.i /* conio.h */ … /* graphics.h */ … … main() { … } Fichier1.i /* stdio.h */ … /* maths.h */ … … Calculs() { … } Compilation Math.lib stdio.lib Fichier2.obj Fichier1.obj Graphics.lib Edition de liens Prof Asmaa El Hannani 2AP-S3 Fichier.exe 17 Structure d’une application en C Programme typique en C include Main() est toujours la 1ere fonction appelée main() fonction a() instructions fonction b() instructions instructions Prof Asmaa El Hannani 2AP-S3 18 Programme minimum en C Le programme commence toujours par la fonction main Directives préprocesseur – Inclure les bibliothèques Instruction toujours terminée par ; Bloc d’instructions encadré par des accolades Le programme renvoie toujours une valeur Insérer de préférence une ligne vide Prof Asmaa El Hannani 2AP-S3 19 Structure d’un programme C Un programme C peut se décomposer par : Des directives de préprocesseur Des déclarations de types, de variables et de constantes Des prototypes de fonctions Des définitions de fonctions parmi lesquelles la fonction main Prof Asmaa El Hannani 2AP-S3 20 Exemple Prof Asmaa El Hannani 2AP-S3 21 Eléments de base #include # include <stdio.h> main() { printf(’’Bonjour!’’); } La directive #include inclu le fichier stdio.h au programme avant la compilation (pour pouvoir utiliser la fonction prédéfinie printf. Une directive ne s’applique qu’à la partie du programme qui lui succède). D’une manière générale, il est préférable de les placer au début ! On parle alors de directives à destination du préprocesseur Prof Asmaa El Hannani 2AP-S3 23 Les Commentaires Il existe trois types de commentaire en C : Tout texte entre « // » et la fin de la ligne Tout texte entre « /* » et « */ »: commentaire multi ligne # include <stdio.h> //pour pouvoir utiliser la fonction printf main() { printf(’’Bonjour!’’); } /* Ce programme imprime la chaine de caractère ‘’Bonjour!’’ à l’écran */ Prof Asmaa El Hannani 2AP-S3 24 Les identificateurs Les identificateurs servent à désigner les différents objets manipulés par le programme: Variables, fonctions, … Commence nécessairement par une lettre Une lettre majuscule est tenue pour différente de la lettre minuscule correspondante; Au plus 32 caractère Le caractère _ (appelé « blanc souligné ») est considéré comme une lettre ; il peut donc figurer à n'importe quelle place dans un identificateur: _Total2, Prix_unit Prof Asmaa El Hannani 2AP-S3 25 Les mots-clés Certains « mots-clés » sont réservés par le langage à un usage bien défini et ne peuvent pas être utilisés comme identificateurs. Auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while Prof Asmaa El Hannani 2AP-S3 26 Types et variables Qu'est-ce qu'une variable ? c'est le nom d’un emplacement mémoire on en crée (presque) autant qu’on veut son contenu peut changer dans le temps. elle contient toujours quelque chose !!! Qu'est-ce qu'un type ? définit une convention de codage de l'information dans un emplacement de taille préfixée Une variable sera toujours définie par un type avant utilisation Prof Asmaa El Hannani 2AP-S3 27 Les types de données Prof Asmaa El Hannani 2AP-S3 28 Les Types dans C Les types de base du langage C se répartissent en 3 grande catégories en fonction de la nature des informations qu’ils permettent de représenter: Nombres entiers (int) Nombres flottants (float ou double) Caractère (char): apparaît en C comme un cas particulier de int. Ils peuvent être signés ou non signés : signed ou unsigned Prof Asmaa El Hannani 2AP-S3 29 Les Types Entiers short int ou short (entier sur 16 bits : - 32 768 à 32 767) int (entier sur 32 bits : - 2 147 483 648 à 2 147 483 647) long int ou long (entier sur 32 bits ou 64 bits, selon les machines) Chacun des 3 peut être nuancé par l’utilisation du qualificatif unsigned pour ne représenter que des nombres positifs: Exemple: unsigned short x; x peut aller de 0 à 65 535 pas de bit réservé pour le signe C accepte aussi les constantes entière en notation hexadécimale ou octale: 014 (octale) correspond à la valeur décimale 12 0x1A (hexadécimale) correspond à la valeur décimale 26 (16+10) Prof Asmaa El Hannani 2AP-S3 30 Les Types Flottants Float : codé sur 4 octets avec 1 bit de signe, 23 bits de mantisse et 8 bits d'exposant (3.4 x 10-38 à 3.4 x 1038) Double : codé sur 8 octets avec 1 bit de signe, 52 bits de mantisse et 11 bits d'exposant (1.7 10-308 à 1.7 10308) Long : codé sur 10 octets avec 1 bit de signe, 64 bits de mantisse et 15 bits d'exposant (3.4 10-4932 à 3.4 104932) C accepte les constantes flottante en notation décimale ou scientifique: 3.5e+3 Prof Asmaa El Hannani 3500 2.43 -0.38 2AP-S3 -.38 4. .27 31 Le Type Char Char : un caractère est un entier signé codé sur 1 octet (-128 à 127) Les constantes de type « caractère », lorsqu’elles correspondent à des caractères imprimables, se notent de façon classique, en écrivant entre apostrophes le caractère voulu, comme dans ces exemples : 'a' 'Y' '+' '$‘ Il existe des caractères non imprimables, tel que le changement de ligne, de Tabulation, … en voici un tableau récapitulatif Prof Asmaa El Hannani 2AP-S3 32 Caractères spéciaux NOTATION RESULTAT \a cloche ou bip (alert ou audible bell) \b Retour arrière (Backspace) \f Saut de page (Form Feed) \n Saut de Ligne (Line Feed) \r Retour chariot (Carriage Return) \t Tabulation horizontaLe (HorizontaL Tab) \v Tabutation verticale (VerticaL Tab) \\ \ \' ‘ \ '' ‘’ \? ? Prof Asmaa El Hannani 2AP-S3 33 Type booléen Pas de type booléen en C. Le type booléen est représenté par un entier. Il se comporte comme la valeur booléenne vraie si cette valeur entière est non nulle. Dans un contexte qui exige une valeur booléenne (comme les tests, par exemple), un entier non nul équivaut à vrai et la valeur zero équivaut à faux. Prof Asmaa El Hannani 2AP-S3 34 Les conversions de types Dans certains cas, le compilateur peut être amené à effectuer certaines conversions lors des évaluations pour obtenir un exécutable correct : int i, j, k; On peut laisser faire certaines float x; conversions implicites, mais il faut mieux apprendre à les x = i; maîtriser soi-même. j = k+x; Pour forcer une conversion : (type) expression ; int i, j, k; float x; x = (float) i; j = k + (int) x; Prof Asmaa El Hannani 2AP-S3 35 La déclaration de variables Les déclarations des types des variables sont obligatoires et doivent être regroupées au début du programme. Elles peuvent être soit individuelle ou groupées : type variable (optionnel = valeur) ; Le ; est obligatoire Une variable peut être initialisée à une valeur au moment de sa déclaration Le nom de la variable doit commencer par une lettre Le type détermine la taille (ou l’occupation mémoire) de la variable Prof Asmaa El Hannani 2AP-S3 36 La déclaration de variables Char Auto Register Const Static volatile extern Unsigned Short Signed Int long Identificateur; Float Double Long double Prof Asmaa El Hannani 2AP-S3 37 Les constantes Il est possible de déclarer que la valeur d’une variable ne doit pas changer lors de l’exécution du programme. const double CST = 20.3 ; Le ; est obligatoire Opérateur = obligatoire La constante reçoit une valeur lors de la compilation et est ensuite protégée contre d’autres modifications Le Type de la constante Prof Asmaa El Hannani 2AP-S3 38 Opérateurs et Expressions Les opérateurs du C C dispose d'un important éventail d'opérateurs: les opérateurs de calcul ………………d'assignation ………………d'incrémentation ………………de comparaison ………………logiques ………………bit-à-bit ………………de décalage de bit Les priorités Prof Asmaa El Hannani 2AP-S3 40 Les opérateurs de calcul Les opérateurs de clacul (arithmétiques) binaires ne sont à priori définis que pour deux opérandes ayant le même type parmi: int, long int, float, double, long double et ils fournissent un résultat de même type que leurs opérandes. Prof Asmaa El Hannani 2AP-S3 41 Les opérateurs de calcul De plus, il existe un opérateur de "modulo" noté % qui ne peut porter que sur des entiers et qui fournit le reste de la division de son premier opérande par son second. Par exemple, 11%4 vaut 3, 23%6 vaut 5 Remarque: le quotient de deux entiers fournit un entier. Ainsi 5/2 vaut 2; en revanche, le quotient de deux flottants (noté, lui aussi, /) est bien un flottant (5.0/2.0 vaut bien approximativement 2.5). Prof Asmaa El Hannani 2AP-S3 42 Conversion implicite de type On peut écrire des expressions mixtes dans lesquelles interviennent des opérandes de types différents: Int n,p; float x; n*x + p (int * float) + int Conversion implicite: int float ( float*float) + int Même mécanisme : float + int float + float float On parle de conversion implicite de type: intlongfloatdoublelong double Prof Asmaa El Hannani 2AP-S3 43 Promotions numériques En C les opérateurs numériques ne sont pas définis pour le types char et short : C prévoit que toute valeur char ou short soit d’abord convertie en int. short n,p; float x; n*x + p (short * float) + short Conversion systématique: ( int * float) + int Conversion implicite : float * float + int float + float float Prof Asmaa El Hannani 2AP-S3 44 Les opérateurs d'assignations i = 5 est une expression qui réalise une action d'affectation de la valeur 5 à i. Cet opérateur d'affectation (=) peut faire intervenir d'autres expressions comme dans : c=b + 3 En C une opération x = x + 2 peut aussi s'écrire x += 2; Prof Asmaa El Hannani 2AP-S3 45 Opérateurs d’incrémentation et de décrémentation ++ : incrémente de 1 la valeur de la variable On dit que ++ est: un opérateur de pré incrémentation lorsqu'il est placé à gauche un opérateur de post incrémentation lorsqu'il est placé à droite x=3; //post-incrémentation y= x++; y=x; x=x+1; //y=3, x=4 //pré incrémentation y=++x; x=x+1; y=x; //x=y=5 --: decrémente de 1 la valeur de la variable Utilise les même règles que le ++ Prof Asmaa El Hannani 2AP-S3 46 Les opérateurs de comparaison Comme tout langage, C permet de "comparer" des expressions à l'aide d'opérateurs classiques de comparaison. exemple : 2*a > b +5 Par contre, C se distingue de la plupart des autres langages sur deux points: 1- le résultat de la comparaison est, non pas une valeur "booléenne" (on dit aussi "logique") prenant l'une des deux valeurs vrai ou faux, mais un entier valant: 0 si le résultat de la comparaison est faux, 1 si le résultat de la comparaison est vrai. Ainsi, la comparaison ci-dessus devient en fait une expression de type entier. Cela signifie qu'elle pourra éventuellement intervenir dans des calculs arithmétiques; Prof Asmaa El Hannani 2AP-S3 47 Les opérateurs de comparaison 2- les expressions comparées pourront être de type quelconque et seront soumises au règles de conversion présentées précédemment. Liste des opérateurs: < <= > >= même priorité Exemple: a < b == c < d > == != même priorité (a < b) == (c < d) Remarque: les opérateurs relationnels sont moins prioritaires que les opérateurs arithmétiques ( x+y < a+2 (x+y) < (a+2) ) Prof Asmaa El Hannani 2AP-S3 48 Les opérateurs Logiques C dispose de trois opérateurs logiques classiques: et (noté &&), ou (noté | |) et non (noté ! ). Ces opérateurs acceptent n'importe quel opérande numérique, y compris les types flottants, avec les règles de conversion implicite déjà rencontrées. à condition de considérer que: 0 correspond à faux, toute valeur non nulle correspond à vrai Prof Asmaa El Hannani 2AP-S3 49 Les opérateurs Logiques Exemples: n et p sont des entiers, le compilateur accepte des expression telles que: n && p n||p if ( !n ) if (n == 0) Remarque1: l’opérateur ! a une priorité supérieur à celle de tous lés opérateurs arithmétiques et relationnels. La négation de a==b serait !(a==b) et non !a==b Remarque2: l’opérateur | | est moins prioritaire que &&. Tous deux sont de priorité inférieure aux opérateurs arithmétique et relationnels a<b && c<d équivaut à (a<b) && (c<d) Ne sera évaluée que si a<b est vrai Prof Asmaa El Hannani 2AP-S3 50 Les opérateurs bit-à-bit Prof Asmaa El Hannani 2AP-S3 51 Les opérateurs de décalage de bit Prof Asmaa El Hannani 2AP-S3 52 Autres opérateurs L’opérateur de CAST : Exemple: n=10, p=3; (double) (n/p) aura comme valeur 3 (double) n/p aura comme valeur 3.33333… L’opérateur conditionnel : (seul opérateur ternaire en C) syntaxe : condition ? Valeur si vrai : valeur si faux z = (x==y) ? a : b ; on utilise la valeur de l’expression a>b ? i++ : i-- ; la valeur de l’expression n’est pas utilisée Prof Asmaa El Hannani 2AP-S3 53 Les priorités Prof Asmaa El Hannani 2AP-S3 54 Les Entrées-Sorties Les Entrées-Sorties Conversationnelles C dispose d’une multitude de fonctions pour afficher des informations à l’écran ou pour en lire au clavier. C’est ce que nous avons appelé les « entrées-sorties conversationnelles ». Plus tard, nous verrons que ces mêmes fonctions (moyennant la présence d’un argument supplémentaire) permettent également d’échanger des informations avec des fichiers. Prof Asmaa El Hannani 2AP-S3 56 Les Entrées-Sorties Conversationnelles Fonctions pour l’affichage des données: printf("Format" , expr [ , expr,…]) ; /*affiche des données selon un format */ puts(Chaine); /* affiche une chaîne de caractère */ putchar(caractere); /* affiche un caractère */ Fonctions pour la lecture des données scanf("Format" ,adres_var [ ,adresse_var,…]) ; /*Lit des donnée selon un format */ gets(Var_Chaine); /* Lit une chaîne de caractère */ var_caratere = getchar(); /* Lit un caractère */ var_caratere = getch() ; /* Lit un caratère sur le clavier */ Prof Asmaa El Hannani 2AP-S3 57 Les possibilités de la fonction printf La fonction printf se présente ainsi: printf ( format[, liste_d’expressions] ) format une chaîne de caractères qui spécifie: Des caractères à afficher tels quels; Des code de format repérés par % (c, d, f..) qui précise le type de l’information à afficher. liste_d’expressions : suite d’expressions séparées par des virgules d’un type en accord avec le code format correspondant. Exemple: printf("leur somme est : %d", n1+n2); Un code de format peut contenir des informations complémentaires agissant sur le cadrage, le gabarit ou la précision. Prof Asmaa El Hannani 2AP-S3 58 printf: Les principaux codes de conversion c : char: caractère affiché ''en clair" (convient aussi à short ou à int compte tenu des conversions systématiques) d : int (convient aussi à char, compte tenu des conversions systématiques) u : unsigned int (convient aussi à unsigned char ou à unsigned short, compte tenu des conversions systématiques) ld : long lu : unsigned long Prof Asmaa El Hannani 2AP-S3 59 printf: Les principaux codes de conversion f : double ou float écrit en notation "décimale" avec six chiffres après le point e : double ou float écrit en notation ''exponentielle'' (mantisse entre 1 et 9) avec six chiffres après le point décimal, sous la forme x.xxxxxxe+yyy ou x.xxxxxxe-yyy pour les nombres positifs et -x.xxxxxxe+yyy ou -x.xxxxxxe-yyy pour les nombres négatifs s : chaîne de caractères dont on fournit l'adresse (notion qui sera étudiée ultérieurement) Prof Asmaa El Hannani 2AP-S3 60 printf: Action sur le gabarit d’affichage: Les entiers sont affichés par défaut sans espaces avant ou après. Les flottants avec six chiffres après le point. Pour agir sur l’affichage un nombre est placé après % et précise le nombre de caractère minimum à utiliser. Exemples: printf("%3d" , n ); n = 20 n=3 n = 2358 n = -5200 Prof Asmaa El Hannani ^20 // ^ désigne un espace ^^3 2358 -5200 2AP-S3 61 printf: Action sur le gabarit d’affichage: Exemples: printf("%f" , x ); x = 1.2345 1.234500 x = 12.3456789 12.345678 printf("%10f" , x ); x = 1.2345 ^^1.234500 x = 1.2345E5 123450.000000 printf("%e" , x ); x = 1.2345 1.234500e+000 x = 123.45 1.234500e+002 Prof Asmaa El Hannani 2AP-S3 62 printf: Actions sur la précision pour les flottants, on peut préciser un nombre de chiffres après le point décimal Exemples: printf("%10.3f" , x ); x = 1.2346 ^^^^^1.235 x = 1.2345E3 ^^1234.500 x = 1.2345E7 12345000.000 Remarques: Cadrage de l’affichage à gauche : printf("%-10.3f" , x ); x = 1.2345 1.235^^^^^ Le caractère * figurants à la place d’un gabarit ou une précision signifie que la valeur effective est fournie dans la liste des arguments de printf: printf("%8.*f" , n, x ); n=1; x=1.2345 ^^^^^1.2 La fonction printf fournit une valeur de retour (nombre de caractère affichés) Prof Asmaa El Hannani 2AP-S3 63 printf: Les erreurs de programmation Erreur1: Code de format en désaccord avec le type de l’expression à afficher: Conséquence : mauvaise interprétation si même taille (int en %u), sinon, conséquences plus désastreuses. Erreur 2: Nombre de code de format différents du nombre d’expressions de la liste Conséquence 1: si des expressions de la liste n’ont pas de format, elles ne seront pas affichées ( printf("%d" , n, p ); // valeur de p ne sera pas affiché ) Conséquence 2 : s’il y a trop de code de format, printf cherchera à afficher n’importe quoi ( printf("%d %d" , n ); n=8 8 2 ) Prof Asmaa El Hannani 2AP-S3 64 Les possibilités de la fonction scanf La fonction scanf se présente ainsi: scanf ( format, liste_d_adresse ) format une chaîne de caractères qui spécifie: Des code de format repérés par %, précisant le type de l’information à lire. liste_d_adresses : liste d’adresse, séparées par des virgules, d’un type en accord avec le code de format correspondant. Exemple: scanf ("%d", &p) ; Il faut noter la nécessité de recourir à l’opérateur & pour désigner l’adresse de la variable pour laquelle on souhaite lire une valeur. Prof Asmaa El Hannani 2AP-S3 65 scanf : Les principaux codes de conversion : c : char d : int u : unsigned int hd : short int hu : unsigned short ld : long lu : unsigned long f ou e : float écrit en notation "décimale" ou ‘'exponentielle'' Lf ou le : double écrit en notation "décimale" ou ‘'exponentielle'' s : chaîne de caractères dont on fournit l'adresse (notion qui sera étudiée ultérieurement) Prof Asmaa El Hannani 2AP-S3 66 scanf : Notion de tampon et de séparateurs Lorsque scanf attend des données, l’information frappée au clavier est rangée temporairement dans l’emplacement mémoire nommé « tampon ». Le tampon est exploré caractère par caractère au fur et à mesure des besoins. Certains caractères jouent un rôle particulier: les séparateurs (l’espace et la fin de ligne \n) Prof Asmaa El Hannani 2AP-S3 67 scanf : Les règles utilisées par scanf Les codes de format correspondant à un nombre entraînent l’avancement du pointeur jusqu’au 1er caractère différent d’un séparateur, puis scanf prend en compte tous les caractères suivants jusqu’à la rencontre d’un séparateur. Quand au code de format %c, il entraîne la prise en compte du caractère désigné par le pointeur (même un séparateur) et il est avancé sur le caractère suivant. Prof Asmaa El Hannani 2AP-S3 68 scanf : Les règles utilisées par scanf Exemples : (n et p sont de type int, c char, @ désigne une fin de ligne) scanf("%d%d" , &n, &p ); 12^25@ ^12^^25^^@ n = 12 p=25 n = 12 p=25 scanf("%d%d" , &n, &p ); 12@ @ ^25 n = 12 p=25 scanf("%d%c" , &n, &c ); 12^a@ n = 12 c=‘ ‘ Prof Asmaa El Hannani 2AP-S3 69 scanf : On peut imposer un gabarit maximal Le traitement d’un code de format s’interrompe soit à la rencontre d’un séparateur, soit lorsque le nombre de caractère indiqué a été atteint !! Exemples : (n et p sont de type int, @ désigne une fin de ligne) scanf("%3d%3d" , &n, &p ); 12^25@ ^^^^^12345@ 12@ 25@ Prof Asmaa El Hannani 2AP-S3 n = 12 n = 123 p=25 p=45 n = 12 p=25 70 scanf : Rôle d’un espace dans le format Un espace entre deux codes de format demande à scanf de faire avancer le pointeur au prochain caractère différent d’un séparateur !! Exemples : (n et p de type int, c char, @ désigne la fin de ligne) scanf("%d %c" , &n, &c ); 12^a@ n = 12 c=‘a‘ 12^^^@ a@ Prof Asmaa El Hannani n = 12 c=‘a‘ 2AP-S3 71 scanf : Arrêt prématuré de scanf Un arrêt prématuré de scanf a lieu dans le cas où scanf n’est pas en mesure de fabriquer une valeur adéquate !! Exemples : (n et p de type int, c char, @ désigne la fin de ligne) compte = scanf("%d %d %c" , &n, &p, &c ); 12^25^b@ n = 12 p = 25 c=‘b‘ 12b@ n = 12 p indéfini c indéfini b@ n indéfini p indéfini c indéfini compte = 3 compte = 1 compte = 0 La valeur de retour fournie par scanf indique le nombre de valeurs convenablement lues. Prof Asmaa El Hannani 2AP-S3 72 scanf : Problème de synchronisation entre l’écran et le clavier Le tampon n’est pas vide à chaque nouvel appel de scanf Pour vider le buffer d'entrée il faut utiliser: fflush ( stdin ); Exemple: 233^122@ Résultat à l’exécution: Prof Asmaa El Hannani donner une valeur pour n : 233 122 Merci pour 233 donner une valeur pour p : Merci pour 122 2AP-S3 73 scanf : Les erreurs de programmation Erreur1: Code de format en désaccord avec le type de l’expression: Conséquence: Si même taille introduction d’une mauvaise valeur Si la variable a une taille inférieur écrasement d’un emplacement mémoire consécutif à cette variable Erreur 2: Nombre de codes de format différent du nombre d’éléments de la liste: Conséquence: Scanf("%d",&n, &p); seule la valeur de n est lue Scanf("%d%d",&n); on affecte une valeur à un emplacement aléatoire de la mémoire Prof Asmaa El Hannani 2AP-S3 74