Sunteți pe pagina 1din 110

Gnralits

1. GENERALITES
1.1 Introduction - Historique Le langage C est un langage de programmation conu pour de multiples utilisations. Son dveloppement est parallle au systme UNIX. Le noyau du systme UNIX est crit en langage C. Dsormais, il est utilis sur tous les systmes d'exploitation et donc sur toutes les machines. Les principes fondamentaux du langage C sont issus du langage BCPL cr vers 1970 pour le premier systme UNIX dans les laboratoires AT & T par Ken THOMPSON et Dennis RITCHIE. En 1970, Ken THOMPSON cre le langage B inspir du BCPL. En 1972, Dennis RITCHIE dfinit le langage C partir des travaux de Ken THOMPSON. Ces travaux seront continus par Brian W Kernigham et DM Ritchie en 1972 pour donner naissance au premier ouvrage de rfrence "Le langage C" Editions MASSON. Si le noyau du langage C est assez restreint, il s'enrichit d'une librairie standard qui contient des fonctions permettant les traitements les plus divers (Entres/Sorties, Traitements des chanes de caractres, Gestion dynamique de la mmoire, etc...). L'tude du langage C passe obligatoirement par l'tude complte du noyau. Ultrieurement, vous pourrez aborder l'tude de la POO (Programmation Oriente Objet) en C++. Le langage C est un langage structur, dclaratif et faiblement typ. Cette structuration s'appuie sur quatre lments: l'application les fichiers les fonctions les donnes Des travaux de normalisation ont t entrepris partir de 1983. Le C-ANSI a t approuv fin 1988 (Norme X3-159-1989). Dans ce document, on s'efforcera d'utiliser la norme ANSI. Tous les exemples (sauf avertissement) sont donns pour un compilateur respectant la norme.

PS/LANGAGES

Page 1

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Gnralits

1.2 Notions de fonctions et de blocs Les units de structuration du langage C sont: - la fonction qui correspond la notion de sous-programme en PASCAL, FORTRAN ou ADA. Il n'y a pas de distinction entre procdure (qui effectue une action) et fonction (qui calcule un rsultat en fonction de paramtres). - les fichiers comprenant des dclarations de fonctions et d'objets. Les fichiers peuvent tre compils sparment. Ils constituent des modules, brique de base dans la construction d'applications. Un programme C, c'est donc un ou plusieurs fichiers comprenant: - des dclarations de fonctions. - des dclarations d'objets, variables ou constantes. - des directives pour le prprocesseur. Contrairement PASCAL ou ADA, on ne peut dclarer de fonctions l'intrieur d'une autre fonction. Une fonction est un module (ou sous programme) destine effectuer une opration lmentaire et une seule, en dfinissant les cas limites. En langage C, un programme source est constitu de fonctions dont une (appele main) constitue le point d'entre dans le programme. On ne peut trouver qu'un seul 'main' dans un programme. Un bloc est un ensemble d'instructions formant une entit logique indissociable borne par une accolade ouvrante '{' (dbut) et une accolade fermante '}' (fin).Le plus grand bloc est la fonction. fonction1(...); fonctionN(...); main() /* Point d'entre */ { Possibilits de variables locales Code } fonction1(...) { Possibilits de variables locales Code } fonctionN(...) { Possibilits de variables locales Code } La fonction main est reconnue par l'diteur de liens comme le point de dpart de l'excutable.

PS/LANGAGES

Page 2

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Gnralits

fichier1.c main( ) { ... }

fichier2.c fonction1( ) { ... }

fichier3.c fonctionN( ) { ... } Fichiers Sources

Compilation fichier1.o fichier2.o fichier3.o Fichiers Objets

Librairies Edition de Liens

Programme

Fichier excutable

PS/LANGAGES

Page 3

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Gnralits

1.3 Le compilateur c Compilation et Edition de liens sont regroups dans une seule commande qui, suivant les options, enchane tout ou partie des phases suivantes:

Source C

$ cc fichier.c va analyser toutes les directives commenant par le signe # va liminer tout texte compris entre /* et */

cpp

Source C

fichier.i le compilateur c va gnrer du code source assembleur machine

ccom

Source Assembleur

fichier.s Assembleur langage machine

as

Code Objet

fichier.o

ld

Editeur de liens entre le code objet et les bibliothques scrutes

Code Excutable

a.out

PS/LANGAGES

Page 4

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Gnralits

1.3.1 La compilation sous UNIX La commande de compilation sous UNIX est : cc [options] liste de fichiers Extension des fichiers Fichiers sources Fichiers compilables Modules assembleur Fichiers objets Librairies statiques Excutable

.c .i .s .o .a sans extension

Quelques options de la commande cc sur DPX20 cc fic1.c excutable a.out cc fic1.c -o prog excutable prog cc -O fic.c -o prog excutable optimis prog cc -c fic1.c module objet fic1.o cc -S fic1.c source assembleur fic1.s cc -P fic1.c source compilable fic1.i cc fic1.c fic2.c -o prog excutable prog constitu partir des 2 fichiers sources fic1.c et fic2.c cc fic1.o fic2.o -o prog excutable prog constitu partir des 2 fichiers objets fic1.o et fic2.o cc -lm fic1.c -o prog excutable prog en linkant la librairie mathmatique libm.a cc -g fic1.c excutable a.out contenant des informations de dboggage cc fic.c -qsrcmsg affiche la ligne source en erreur marque les items en erreur dans la ligne cc fic.c -qxref produit un listing objet qui inclut les cross reference dans fic.lst Remarques : la librairie standard (libc.a) est linke automatiquement. 1.3.2 La compilation sous TURBO C Sous l'environnement de dveloppement intgr (EDI), la compilation d'un fichier source s'obtient par - la commande Compile (raccourci : Alt F9) qui compile le fichier - ou par la commande Make (raccourci F9) qui produit directement l'excutable. Il est galement possible de compiler par l'utilitaire TCC (compilateur en ligne de commande partir de la ligne de commande MSDOS) en utilisant les nombreuses options disponibles (cf documentation TURBO C de BORLAND). Le TURBO C produit des fichiers objets d'extension .OBJ et des fichiers excutables d'extension .EXE.

PS/LANGAGES

Page 5

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Elments de base du langage

2. ELEMENTS DE BASE DU LANGAGE


2.1 Les identificateurs Un identificateur permet de nommer une variable, une pseudo-constante ou une fonction. Ils doivent tre crits selon les rgles suivantes : - 32 caractres maximum (certains systmes ne tiennent compte que des 8 premiers). - le premier caractre doit obligatoirement tre soit une lettre soit un soulign ( viter). - les autres caractres peuvent tre indiffremment des lettres (a-z), des chiffres ou le soulign. - le signe '-', l'espace, les caractres accentus ainsi que tous les caractres non cits au paragraphe prcdent sont interdits. - en rgle gnrale, le nom des variables est crit en lettres minuscules et celui des pseudo-constantes en majuscules (Conventions des programmeurs). - le compilateur C fait la diffrence entre majuscules et minuscules. Certains identificateurs sont interdits car ils constituent les mots rservs du langage. 2.2 Les mots rservs Types const char int float short long unsigned double struct union enum signed volatile Classes auto extern static register Intructions if else while do for switch break continue return goto Autres sizeof case default void typedef

PS/LANGAGES

Page 7

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Elments de base du langage

2.3 Les sparateurs Les diffrents sparateurs reconnus par le compilateur peuvent avoir plusieurs significations. Type Nom Significations [] Crochets Indice d'accs dans un tableau () Parenthses 1/ Groupement d'expressions (forcer la priorit) 2/ Isolement des expressions conditionnelles 3/ Dclaration des paramtres d'une fonction 4/ Conversion explicite d'un type (casting) {} Accolades 1/ Dbut et fin de bloc d'instructions 2/ Initialisation la dclaration d'un tableau 3/ Dclaration d'une structure , Virgule Spare les lments d'une liste d'arguments ; Point virgule Terminateur d'instruction : Deux points Indique une instruction avec label . Point Permet l'accs un champ d'une structure 2.4 Les commentaires Les commentaires permettent de porter des remarques afin de faciliter la lecture d'un programme source. Chaque commentaire est dlimit par les combinaisons suivantes : /* dbut de commentaire

*/ fin de commentaire Les commentaires ne peuvent pas tre imbriqus. Les commentaires ne sont pas pris en compte par le compilateur et n'augmentent donc pas la taille des programmes excutables. Remarque: en Turbo C et dans les versions les plus rcentes, la squence // permet de mettre la ligne courante en commentaires.

PS/LANGAGES

Page 8

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Elments de base du langage

2.5 Principales directives de compilation 2.5.1 Gnralits Avant de raliser les oprations de compilation, le systme utilise un outil appel prprocesseur qui excute les directives de compilation places dans le programme source. Prcdes du dise (#), elles sont places, de prfrence, en tte du programme. 2.5.2 Inclusion de fichier Pour fonctionner, un programme en langage C a besoin d'un certain nombre de dclarations ou donnes stockes dans des fichiers d'en tte (.h). Il est donc ncessaire que ces fichiers soient intgrs au programme source avant la compilation. #include <fichier> ou #include "fichier" Cette directive permet d'inclure des fichiers issus d'une bibliothque lors de la compilation. Si le fichier inclure est dans le rpertoire 'include' ou 'usr/include', le nom du fichier sera encadr par <...>, sinon le chemin d'accs du fichier est mis entre guillemets. Exemples: #include <stdio.h> #include"ma_biblio/mon_fic.h" 2.5.3 Dfinition de pseudo-constante #define expression Cette directive permet de crer une pseudo-constante. Par convention, on crit le nom des pseudo-constante en lettres majuscules. 2.5.4 Dfinition de macro-instructions Le prprocesseur permet la dfinition de macro-instructions. Une macro-instruction est une dfinition comportant des paramtres nomms entre parenthses tout de suite aprs le nom de la macro. Une macro s'utilise comme une fonction. Le programme est plus rapide (conomie du temps d'appel et de retour) mais plus gros. Exemple: #define maxi(a,b) ((a>b)?(a):(b)) Remarque: il faut mettre des parenthses pour viter tout problme de prcdence des oprateurs lors de l'utilisation de la macro dans une expression. Ce problme de prcdence des oprateurs sera vu au cours du chapitre 4 sur les oprateurs de base.

PS/LANGAGES

Page 9

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Elments de base du langage

2.5.5 Compilations conditionnelles On peut contrler le fonctionnement du prprocesseur grce des instructions conditionnelles qui sont values au cours du pr-traitement. 2.5.5.1 Annulation de constante #undef expression Cette directive permet d'annuler l'effet d'un #define. Elle est surtout utilise pour remplacer les macro-instructions dfinies dans les fichiers d'entte. Si l'expression n'a pas t dfinie, la directive n'a aucun effet. 2.5.5.2 Contrle de dfinition #ifdef expression instructions #endif #ifndef expression instructions #endif Ces deux directives permettent de vrifier si une expression a t (ifdef) ou n'a pas t (ifndef) dfinie. Si la rponse est 'oui', les instructions qui suivent seront excutes jusqu' la rencontre du #endif. 2.5.5.3 L'inclusion conditionnelle #if <condition> instructions_1 #else instructions_2 #endif Si condition est vraie, instructions_1 sera inclue, dans le cas contraire c'est instructions_2. #if <condition_1> instructions_1 #elif <condition_2> instructions_2 #endif Si condition_1 est vraie, instructions_1 sera inclue. Dans le cas contraire, condition_2 sera value, si elle est vraie instructions_2 sera inclue.

PS/LANGAGES

Page 10

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Elments de base du langage

Exemple: #if flag = = 1 #include "ficl.h" #elif flag == 2 #include "fic2.h" #else #include "fic3.h" #endif

2.6 Les constantes Une constante est une donne dont on ne peut modifier la valeur. Les constantes symboliques sont dclares en utilisant la directive de compilation #define. 2.6.1 Les constantes entires Exemples: #define TINTIN #define MILOU #define DUPONT #define DUPOND

14 0325 0xd5 0XD5

/* exprime en dcimal */ /* exprime en octal */ /* exprime en hexadcimal */ /* exprime en hexadcimal */

Le programmeur peut demander que les constantes entires soient codes sur un long en ajoutant la lettre L (ou l) la fin de la valeur. #define ASTERIX 2.6.2 Les constantes relles Exemples: #define PI #define PI2 14L

3.14159 0.314e+1

/* notation dcimale */ /* notation scientifique */

Les constantes relles sont associes un codage en mmoire sur un double (8 octets). 2.6.3 Les constantes caractres Exemple : #define DOLLAR

'$'

Les caractres peuvent tre reprsents par le caractre '\' suivi du code ASCII octal ou par le caractre '\x' suivi du code ASCII hexadcimal. Exemples: #define BELL #define ESCAPE #define CR #define BS

'\007' '\033' '\x0d' '\x08'

/* Code ASCII 007 en octal de la sonnerie */ /* Code ASCII 033 en octal : touche ESC */ /* Code ASCII 0d en hexadcimal : Return */ /* Code ASCII 08 en hexadcimal : BackSpace */

PS/LANGAGES

Page 11

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Elments de base du langage

Certains caractres particuliers sont reprsents par le caractre \ suivi d'une lettre symbolisant leur fonction. Signification Fin de ligne Tabulation horizontale Tabulation verticale Retour arrire Retour chariot Saut de page Signal sonore Barre oblique inverse Guillemet Apostrophe Caractre nul Nombre octal Nombre hexadcimal Mnmonique Code ASCII LF 0A HT 09 VT 0B BS 08 CR 0D FF 0A BEL 07 \ 5C " 22 ' 2C NUL 0 ooo hh Symbole \n \t \v \b \r \f \a \\ \" \' \0 \ooo \xhh

2.6.4 Les constantes chanes Une chane de caractres en C est encadre par des doubles quotes. Exemple: #define TITRE "Bonjour et Bienvenue" Observation: En mmoire, cette chane sera termine par '\0'. Remarque: pour insrer des caractres " ou \ dans une chane, on les fait prcder d'un \. 2.7 Les variables Comme tout langage dclaratif, le langage C exige que les variables soient dclares avant leur utilisation. Une variable est dfinie par 3 attributs: - son nom (l'identificateur de la variable) - son type - sa classe d'allocation en mmoire Ces trois informations doivent se retrouver dans la dclaration de la variable (de manire explicite ou non).
Dclaration : [classe] [unsigned] <type> <identificateur>;

Exemples: int i; static int nb;

/* dclaration d'une variable i de type int de classe auto */ /* (classe auto par dfaut) */ /* dclaration d'une variable nb de type int de classe static */

Remarque: la notion de classe sera revue au cours du chapitre suivant.

PS/LANGAGES

Page 12

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Elments de base du langage

Les variables symboliques (i ou nb) permettent de stocker des valeurs et ont un type associ. Il y a deux valeurs associes une variable symbolique. La valeur de la donne stocke en mmoire une position donne. On l'appelle rvalue (right-value ou read-value). La valeur de cette position, c'est--dire l'adresse en mmoire o est stocke la valeur. On l'appelle lvalue (left-value ou location-value). Exemple : dans l'instruction suivante i = i + 5; la variable symbolique i apparat la fois du ct droit et du ct gauche de l'oprateur =. L'instance du ct droit est lue (read) mais pas modifie, c'est une rvalue L'instance du ct gauche est crite (location), c'est une lvalue.

PS/LANGAGES

Page 13

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Elments de base du langage

2.8 Structure d'un programme en langage C Inclusions si ncessaire (#include) Dfinition des pseudo-constantes ("#define") Dfinitions de type Prototypes des fonctions Dclaration des variables globales main() (point d'entre du programme) { Dclaration des variables locales au main Instructions } Type et nom de la premire fonction (paramtres) { Dclaration des variables locales Instructions } .../... Type et nom de la nime fonction (paramtres) { Dclaration des variables locales Instructions }

PS/LANGAGES

Page 14

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les types de base

3. LES TYPES DE BASE


Bien que le langage C soit faiblement typ, la notion de type est trs prsente. Tout objet possde un type et un seul, celui qui lui a t donn lors de la dclaration. Un objet possde un moment donn une valeur et une seule: celle-ci doit appartenir l'ensemble des valeurs dtermin par le type (Attention : le langage C ne le vrifie pas toujours). Toute opration sur un objet doit appartenir l'ensemble des oprations permises par ce type. 3.1 Gnralits-classification 3.1.1 Les types de base Les types de base correspondent aux types directement supports par la machine. Les entiers int short long char Les rels float double

entier entier court entier long caractre ASCII qui est un entier

rel en virgule flottante rel en virgule flottante double prcision

Il n'existe pas de type boolen. Mais, un entier gal zro est considr comme faux et diffrent de zro comme vrai. 3.1.2 Les types drivs le type pointeur pour avoir des objets contenant l'adresse d'objets d'un type donn. le type tableau pour avoir des objets composs d'objets de mme type. le type structure pour avoir des objets composs d'objets de types diffrents. le type union pour manipuler des objets de type diffrents sur une mme zone mmoire. le type fonction : objet particulier. le type numration pour dcrire un ensemble fini de valeurs entires. 3.1.3 Le type void Le type void est un type particulier dans la mesure o il n'existe aucun objet de type void. Il ne sert qu'a prciser qu'une fonction ne renvoie rien ou n'a pas de paramtre. Exemples: void imprime (int); /* la fonction imprime ne retourne aucune valeur */ void va_a_la_ligne (void); /* la fonction va_a_la_ligne ne retourne aucune valeur et n'attend aucun paramtre*/

PS/LANGAGES

Page 15

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les types de base

3.1.4 Les dfinitions de types par typedef On dit aussi type synonyme. Le mot rserv typedef permet de dfinir un type synonyme (en gnral une abrviation) pour un type existant. Exemple: typedef enum {FAUX,VRAI} booleen; Permet de dclarer un synonyme (un alias) pour le type enum {FAUX,VRAI}. Typedef sert beaucoup pour la documentation du programme et la rduction de la complexit de notation d'un type driv. En cela, il amliore la lisibilit des dfinitions et contribue la portabilit (Exemple : les tailles des variables de type int selon la machine). Se reporter au chaptre 9 pour plus de prcisions sur typedef. 3.2 Les types entiers Ce sont des variables de type simple dont la taille et les limites varient en fonction de la machine utilise. Dclaration : [classe] [unsigned] <type> <nom>; Observations: Une variable peut tre dclare signe (signed valeur par dfaut), ou non signe (unsigned ). Dans ce dernier cas, le bit de signe est interprt en tant que bit de valeur. Si la variable est dclare signe, le premier bit sera utilis pour reprsenter le signe. Le codage d'un nombre ngatif est ralis par la mthode du complment deux. Exemples: unsigned int ent; /* dclaration de la variable ent de type entier non sign */ char a = '\n'; /* dclaration et initialisation de la variable */ Limites d'utilisation des variables en fonction des tailles
Type int short unsigned short long unsigned long char unsigned char Dnomination Entier Entier court Entier court non sign Entier long Entier long non sign Caractre Caractre non sign Longueur UNIX 4 2 2 4 4 1 1 Longueur DOS 2 2 2 4 4 1 1 Valeurs limites

-32 768 32 767 0 65535 -2 147 483 648 2 147 483 647 0 4 294 967 295 -128 127 0 255

En cas de dpassement de capacit lors de l'excution, aucune erreur ne sera signale mais la valeur sera errone.

MLe fait que les variables de type char soient signes ou non dpend de la machine utilise mais les caractres imprimables sont toujours positifs.

PS/LANGAGES

Page 16

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les types de base

3.3 Les rels


Type float double long double* Dnomination Rel Rel double prcision Rel trs grande prcision Longueur 4 8 10 Valeurs limites [+/-].701411E-38 [+/-].701411E38 [+/-]1.0E-307 [+/-]1.0E307 [+/-]3.4E-4932 [+/-]1.1E4932

En cas de dpassement de capacit lors de l'initialisation, la valeur est considre comme + ou - la valeur minimale. Si cette erreur a lieu lors d'un calcul, l'excution du programme est interrompue avec affichage d'un message d'erreur. * : le type long double n'est pas disponible sur tous les systmes. 3.4 Les caractres Ils sont cods sur 8 bits ( un octet ) et dclars entre ' '. Un caractre peut tre dclar non sign, dans ce cas, la plage des valeurs ASCII sera de 0 255. 3.5 Initialisation des variables Exemples main () { int i, j = 3, k; float x = 12000, y = 1.2e4; long n = 123L, o = 132770; char p1 = 'A', p2 = '\x41', p3 = '\101', p4 = 40; int q = 10, r = 010, s = 0x10; }

/* ou = 0x41*/ /* ou = 0101*/

Toutes les dclarations de variables peuvent comporter le qualificatif const qui indique que leurs valeurs ne seront jamais modifies ou le qualificatif volatile qui demande au compilateur de ne pas optimiser le code concernant cette variable. const type <identificateur> = <valeur>; volatile type <identificateur>; exemples : const int MAX = 100; volatile int i;
PS/LANGAGES Page 17

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les types de base

3.6 Modle mmoire d'un programme C Cas gnral Zone o sont placs dynamiquement (en cours d'excution) les arguments passs aux fonctions et les variables automatiques. Zone de mmoire non alloue, disponible pour l'allocation dynamique. Zone o sont places ( la compilation) les variables externes et les variables internes statiques. Zone o sont places les instructions qui constituent le programme.

PILE

TAS

DONNEES

CODE

Cas du C sous UNIX Dans chaque fichier excutable EN-TETE En-tte dont l'adresse du point d'entre.

Rfrences des fichiers utiliss Code excutable. Fusions des sections Section .TEXT Zone contenant les donnes Section .DATA correspondantes static initialises. Zone contenant les donnes des modules objets Section .BSS static NON initialises. Commentaires des fichiers Section .COMMENT objets Zone contenant les chanes Table des chanes de caractres ventuellement Table des symboles

3.7 Classes d'allocation mmoire Une variable est caractrise par - sa porte (visibilit) Remarque : l'intrieur de cette porte, elle peut tre masque par une dclaration plus interne - sa dure de vie - un lieu en mmoire Le choix de la classe mmoire d'une variable est dtermin par les rponses aux trois questions suivantes: Quelle est la dure de vie de la variable ? Quelle est sa visibilit ? O sera-t-elle stocke ?

PS/LANGAGES

Page 18

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les types de base

Deux sortes de variables: les variables dclares en dehors de toute fonction = variables externes variable confidentielle : la porte est limite au fichier variable exportable (dans par un autre fichier) les variables locales une fonction (ou un bloc)

Quatre sortes de mmoire mmoire statique (zone de donnes) mmoire dynamique (la pile) les registres du processeur le tas (heap) les variables restent vivantes pendant toute la dure de vie du programme les variables sont empiles (dpiles) au rythme des appels des fonctions. rapidit d'accs les variables sont cres dynamiquement

3.7.1 Les variables externes On parle gnralement de variables globales ou semi-globales. Les variables globales sont dclares l'extrieur de toute fonction, sans mot cl, en tte de fichier. Elles sont prcdes du mot cl extern dans les autres fichiers en cas de compilation spare. Elles sont stockes dans la zone de donnes. Les variables globales sont initialises 0 par dfaut. Exemple de variable globale fic1.c int varglob; main() { varglob = 52; fonc(); } fic2.c extern int varglob; fonc() { varglob = 55; ... }

Les variables semi-globales (ou confidentielles) sont dclares en dehors de toute fonction. Leur visibilit est le fichier dans lequel elles sont dclares. Elles sont prcdes du mot cl static. Exemple de variable semi-globale fic1.c fic2.c /* aucune visibilit pour la static int confident; variable confident */ main() fonc2() { { confident = 52; ... fonc1(); } } fonc1() { confident = 0; ... }
PS/LANGAGES Page 19

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les types de base

3.7.2 Les variables locales Les variables locales ne sont pas initialises (valeur indfinie) par dfaut. Elles peuvent l'tre explicitement. Les variables locales statiques ont la dure de vie du programme. Leur visibilit est restreinte la fonction de dclaration. Le contenu de la variable perdure entre chaque appel. Elles sont dclares avec le mot cl static et sont initialises implicitement 0. Exemple: fonc3() { static int nb = 0; nb = nb + 1; printf("Nombre d'appels = %d\n",nb); }

Cette fonction affiche le nombre de fois o elle a t appele (nb n'est initialis que lors du premier appel).

Les variables locales automatiques sont des variables dont la dure de vie et la visibilit sont celles de la fonction de dclaration. Ces variables sont cres automatiquement chaque appel et disparaissent la fin de la fonction. Elles sont dclares avec le mot cl auto qui est facultatif. En effet, la classe auto est la classe par dfaut des variables. Exemples: auto int i; int k; 3.7.3 Les variables locales registres Ce sont des cas particuliers des variables locales automatiques. Elles sont localises dans les registres du processeur quand cela est possible dans un objectif d'optimisation du temps d'accs. Si l'utilisation des registres n'est pas possible, elles sont considres comme des variables locales automatiques. Elles sont dclares avec le mot cl register. La dclaration d'une telle variable reste une demande du programmeur. Il n'y a aucune assurance que cette demande soit satisfaite. Exemple: register int i; Remarques : - Seuls les entiers, les caractres et les pointeurs peuvent tre dclars en register. - On ne peut pas appliquer l'oprateur & un objet dclar de type register. 3.7.4 Tableau rcapitulatif DOMAINE GLOBAL LOCAL Initialisation 0 par le compilateur Initialisation 0 pour les statiques par dfaut par dfaut Dure de vie du programme Dure de vie de la fonction ou du bloc Stocke dans la zone de donnes Empche l'exportation vers un autre Garde sa valeur d'un appel l'autre fichier Classe implicite Place dans un registre du processeur
Page 20

CLASSE

extern static auto register


PS/LANGAGES

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les types de base

3.7.5 Dfinition et dclaration d'une variable En langage C, c'est au programmeur de faire la distinction entre dfinition et dclaration. La dfinition entrane une allocation mmoire alors que la dclaration signifie utilisation. De faon schmatique, on applique les rgles suivantes: Quand une variable est initialise, c'est une dfinition. Quand il n'y a pas d'initialisation et que le mot extern est prsent, c'est une dclaration. 3.8 Conversions de types Contrairement d'autres langages, le langage C autorise des instructions contenant des oprandes de types varis. Lorqu'une expression contient des oprandes de types diffrents, ils sont convertis en un type commun. En gnral, les conversions d'un type 'troit' en un type 'large' s'effectuent sans pertes d'informations. Des conversions se font galement lors des affectations, la valeur de ct droit est convertie dans le type de la valeur du ct gauche qui sera le type du rsultat. Aucun changement n'est interdit par le compilateur. Il revient au programmeur de vrifier que les changements demands ont une signification. 3.8.1 Combinaisons d'oprandes Lorsque plusieurs oprandes de types varis se trouvent dans une expression, le compilateur effectue un certain nombre de conversions en respectant les rgles suivantes: CHAR systmatique INT LONG DOUBLE LONG DOUBLE FLOAT systmatique DOUBLE LONG DOUBLE Fonctionnement gnral: si une expression contient au moins deux types de variables, la variable du type le plus 'troit' est convertie en variable du type suprieur. Certaines conversions sont systmatiques: un caractre est toujours converti en entier. un rel de type float est toujours converti en rel de type double. 3.8.2 Conversions lors d'assignations Lors d'une assignation (variable = expression), la valeur de l'expression est affecte la valeur gauche (left-value). Le compilateur effectue automatiquement les conversions si ncessaire. Conversions automatiques sans perte de prcision et sans perte de signe char int le caractre est plac dans l'octet le moins significatif int long expansion du signe pas de problme int float float double pas de problme Conversions automatiques avec perte de prcision int char perte des octets les plus significatifs long int selon implmentation (pas de problme en UNIX) float int perte de la partie dcimale double float perte de prcision
PS/LANGAGES Page 21

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les types de base

3.8.3 Casting d'oprandes Il est toujours possible d'imposer une conversion de type en prfixant l'oprande avec un type plac entre parenthse. C'est le transtypage ou casting. Syntaxe : (type) expression La conversion est temporaire et est faite aux risques du programmeur. Exemple: main() { int i = 3 , j = 2; float x, y; x = i / j; /* x a pour valeur 1 */ y = (float) i / j; /* y a pour valeur 1.5 */ } Pendant la dure de l'valuation, i est convertie en float. Autre exemple: main() { long n = 200000L; double x; ... x = sqrt((double)n); /* la fonction sqrt rclame un paramtre de type double /* Il est donc ncessaire d'effectuer un transtypage }

*/ */

PS/LANGAGES

Page 22

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les oprateurs de base

4. LES OPERATEURS DE BASE


4.1 Les oprateurs arithmtiques Addition Soustraction Multiplication Division + * /

Modulo

Si les deux oprandes sont de type entier, la division est une division entire. Si au moins un oprande est de type rel, la division est relle. L'oprateur Modulo ne s'applique pas aux rels.

4.2 Les oprateurs de manipulations internes Les oprateurs de manipulations internes permettent d'effectuer des oprations binaires sur les bits d'un caractre ou d'un entier. Symbole & | ^ ~ << >> Rle Et bit bit Ou bit bit Ou exclusif bit bit Complment un (inverse la valeur de chaque bit) Dcalage vers la gauche Dcalage vers la droite

Le dcalage vers la gauche propage des 0 dans la variable. Cela correspond une multiplication par 2. Le dcalage vers la droite propage la valeur du bit de poids fort dans la variable. Cela correspond une division (entire) par 2. 4.3 L'oprateur d'affectation C'est le signe =. L'affectation multiple est possible: L'valuation se fait alors de la droite vers la gauche. Exemple: a = b = c = 0; En langage C, la notion de variable n'est pas assez prcise. Il faut introduire la notion de lvalue (left-value), c'est--dire tout ce qui peut apparatre gauche d'une affectation.

PS/LANGAGES

Page 23

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les oprateurs de base

4.4 Combinaison d'oprateurs L'oprateur d'affectation peut tre associ chacun des oprateurs prcdents pour des abrviations d'criture. x ope = i x = x ope i Exemples: i += 20; i = i + 20; i -= 10; i = i - 10; k *= i; k = k * i; k /= i; k = k / i; 4.5 Incrmentation / Dcrmentation Les oprateurs d'incrmentation et de dcrmentation ne s'appliquent qu' un seul oprande. i = ++j; pr-incrmentation j = j + 1; puis i = j; i = j++; post-incrmentation i = j; puis j = j + 1; i = --j; pr-dcrmentation j = j - 1; puis i = j; i = j--; post-dcrmentation i = j; puis j = j - 1; En prfixe, l'incrmentation ou la dcrmentation est ralise AVANT utilisation. En suffixe, l'incrmentation ou la dcrmentation est ralise APRES utilisation. Exemples: au dbut de chaque ligne i vaut 3 et j vaut 15 quivalence rsultat i = ++j; j = j + 1; i = j; i = 16; j = 16; i = j++; i = j; j = j + 1; i = 15; j = 16 i++; i = i + 1; i=4 j = ++i + 5; i = i + 1; j = i + 5; i = 4; j = 9 j = i++ + 5; j = i + 5; i = i + 1; i = 4; j = 8 4.6 Les oprateurs relationnels
Les oprateurs relationnels apparaissent dans des expressions boolennes qui prennent une des deux valeurs VRAI ou FAUX. En C, le VRAI est diffrent de 0 et le FAUX est gal 0.

Symbole > >= < <= == !=

Rle Strictement suprieur Suprieur ou gal Strictement infrieur Infrieur ou gal Egal Diffrent de

MAttention l'erreur souvent rencontre = (affectation) au lieu de == (comparaison) dans une expression boolenne. Cette erreur est rarement signale par les compilateurs (quelques compilateurs avertissent au moyen d'un warning) car l'affectation est une instruction possible mme dans une expression boolenne.
PS/LANGAGES Page 24

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les oprateurs de base

4.7 Les oprateurs logiques Symbole Rle Le rsultat d'une somme logique est vrai si au moins un oprande est || vrai. Le rsultat d'un produit logique est vrai si tous les oprandes sont vrais. && On appelle complment d'une variable x, la variable note !x telle que : ! x = 0 !x 0 x = 'A' !x 'A' Remarques : dans le cas expr1 || expr2 : si expr1 est vraie, expr2 n'est pas value. dans le cas expr1 && expr2 : si expr1 est fausse, expr2 n'est pas value. 4.8 Oprateur ternaire ou oprateur conditionnel a = expr1 ? expr2 : expr3 ; Si expr1 est VRAI, on value expr2 sinon on value expr3 Exemple: maximum = (a > b) ? a : b ; maximum prend la valeur maximum entre a et b. 4.9 Oprateur squentiel exp1, exp2 Le but de cet oprateur , (virgule) est de garantir l'ordre d'valuation des expressions exp1 et exp2. La valeur retourne par cet oprateur est exp2. Exemple : resultat = (a=1, b=3, c=a+b); resultat contient la valeur de c aprs valuation de a=1 et b=3 soit 4. 4.10 Oprateurs d'adressage Ces oprateurs sont lis la notion de pointeurs. Symbole Rle Adresse de & Contenu de l'objet point par * 4.11 L'oprateur sizeof sizeof donne la taille en octets de l'oprande sizeof(objet) ou sizeof(type) Le rsultat est de type size_t dfini dans le fichier stddef.h (type long en gnral). Cet oprateur est indispensable pour assurer la portabilit des programmes.

PS/LANGAGES

Page 25

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les oprateurs de base

4.12 Autres oprateurs Ces oprateurs sont lis la notion de structure. Symbole Rle Membre de la variable . Membre de la variable point par ->

4.13 Priorits des oprateurs Les rgles de priorit et d'associativit fixent l'ordre d'valuation des diffrents oprateurs au sein d'une expression. Priorit Oprateurs Signification
15 () Expression [] Indice -> Membre d'une structure pointe . Membre d'une structure ! Non logique ~ Complment un ++ Incrmentation -Dcrmentation +Signe (oprateur unaire) (type) Casting * Elment point & Adresse de sizeof() Taille de * Multiplication / Division % Modulo + Addition Soustraction << Dcalage gauche >> Dcalage droite < Infrieur > Suprieur <= Infrieur ou gal >= Suprieur ou gal == Egal != Diffrent de & ET bit bit ^ OU exclusif bit bit | OU bit bit && ET logique || OU logique ?: Expression conditionnelle (ternaire) = Affectation +=, *=, /=, ^=, &=, <<=, >>=, Affectations diverses , Oprateur squentiel

Associativit
de gauche droite

14

de droite gauche

13

de gauche droite

12 11 10

de gauche droite de gauche droite de gauche droite

9 8 7 6 5 4 3 2 1

de gauche droite de gauche droite de gauche droite de gauche droite de gauche droite de gauche droite de droite gauche de droite gauche de gauche droite

Dans le cas o deux oprateurs se trouvent au mme niveau de priorit, la priorit est relative au sens d'valuation.

PS/LANGAGES

Page 26

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les oprateurs de base

L'ordre d'valuation des oprandes est quelconque en C et n'est pas influenc par les parenthses sauf pour les oprateurs &&, ||, ?:, et ,. Exemple: L'criture a[i] = i++ est incorrecte car on ne sait pas si i est incrment avant d'accder au tableau ou aprs. L'criture correcte serait: a[i] = i; i++; /* ou l'inverse suivant ce que dsire le programmeur */ Autre exemple d'criture incorrecte i = 0; while (i < MAX) dest[i] = source[i++]; Il faut crire i = 0; while (i < MAX) { dest[i] = source[i]; i++; } Ces absences de spcification ne sont pas une faiblesse du C mais une force. Pour tirer le meilleur parti du matriel, C laisse la dcision au fabricant. Il vaut mieux ne pas crire de code qui dpende de l'ordre d'valuation pour garder une bonne portabilit. 4.14 Remarques sur les rgles de prcdence Soit les expressions suivantes: a = b = c = 2; Associativit de droite gauche a = b = ( c = 2 ); a = ( b = ( c = 2 ) ); ( a = ( b = ( c = 2 ) ) ); a | b & c * d; Associativit de gauche droite mais priorits dcroissantes : *:(13); &:(8); |:(6) a | b & ( c * d ); a | ( b & ( c * d ) ); ( a | ( b & ( c * d ) ) ); a || b || c || d; Associativit de gauche droite ( a || b ) || c || d; ( ( a || b ) || c ) || d; ( ( ( a || b ) || c ) || d );

PS/LANGAGES

Page 27

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les entres-sorties sur les voies standards

5. LES ENTREES - SORTIES SUR LES VOIES STANDARDS


5.1 Gnralites Le langage C n'est pas dot d'instructions spcifiques d'entre ou de sortie. Il gre ses entres et sorties comme des flux de donnes. Les systmes d'exploitation ouvrent automatiquement des pseudo fichiers. stdin clavier stdout cran stderreur fichier de sortie d'erreur standard (cran) En plus, DOS ouvre stdaux sortie srie stdprn sortie imprimante Le langage C met en place pour certaines fonctions des buffers. Ces buffers sont remplis partir du buffer systme correspondant. Le buffer C n'est lu que lorsque l'utilisateur en fait la demande (Touche ENTER) ou en effectuant un vidage du buffer. L'utilisation des fonctions d'entres/sorties ncessite l'inclusion du fichier stdio.h qui contient les prototypes de ces fonctions. 5.2 Les sorties mises en forme Les fonctions printf s'occupent de mettre en forme les donnes en sortie. int fprintf(FILE *stream, const char *format,[arguments]); fprintf convertit ses arguments d'aprs les spcifications du format, et crit le rsultat sur le flot stream. Elle retourne le nombre de caractres crits ou une valeur ngative en cas d'erreur. int printf(const char *format,[arguments]); printf quivaut fprintf(stdout,const char * format,[arguments]); int sprintf(char *s,const char *format,[arguments])); sprintf est similaire printf, mais le rsultat est crit dans la chane de caractres s et termin par '\0'. Elle retourne le nombre de caractres crits, non compris le '\0'. arguments est la liste des : - variables, - expressions arithmtiques, - des fonctions qui renvoient une valeur. - il doit y avoir autant de formats que d'arguments, - l'excution de l'instruction, la valeur de chaque argument est affiche en remplacement de son format. La correspondance est effectue par position.

PS/LANGAGES

Page 29

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les entres-sorties sur les voies standards

Composition de la chane format: %[drapeaux][largeur][.prcision][interprtation du type]caractre de conversion La chane de caractres format contient des caractres ordinaires et des spcifications de conversion, dont chacun provoque la conversion et l'impression de l'un des arguments. Chaque spcification de conversion commence par le caractre % et se termine par un caractre de conversion. Entre les deux, on peut placer dans l'ordre des drapeaux, une largeur, une prcision, une interprtation du type. Caractres de conversion Caractre d, i o u x, X f Type de l'argument int int int int double Converti en notation dcimale signe notation octale non signe notation dcimale non signe notation hexadcimale non signe en utilisant abcdef pour x ou ABCDEF pour X notation dcimale de la forme : [-]mmm.ddd, o le nombre de d est donn par la prcision (6 par dfaut); si la prcision vaut 0, le point dcimal est supprim notation dcimale de la forme [-]m.ddd e[+/-]xx ou [-]m.ddd E[+/-]xx o le nombre de d est donn par la prcision l'impression se fait suivant le format %e ou %E si l'exposant est infrieur -4 ou suprieur ou gal la prcision; sinon suivant %f. Les zros ou le point dcimal la fin ne sont pas imprims un seul caractre, aprs conversion en unsigned char les caractres d'une chane sont imprims jusqu'au '\0' ou aprs avoir imprim le nombre de caractres indiqu par prcision crit l'argument suivant le format du type pointeur le nombre de caractres crits jusqu' prsent est crit dans l'argument. Ne convertit pas d'argument imprime un %

e, E

double

g, G

double

c s

int char *

p n %

void * int *

Drapeaux : cadre l'argument converti gauche, dans son champ d'impression. - (moins) imprime systmatiquement le signe du nombre. + (plus) espace si le premier caractre n'est pas un signe, place un espace au dbut. pour les conversions numriques, complte le dbut du champ par des 0 zros. spcifie un format de sortie diffrent. Pour o, le premier chiffre sera 0. # Pour x ou X, le prfixe correspondant 0x ou 0X si le rsultat est non nul. Pour e, E, f, g, et G, la sortie comportera un point dcimal. Pour g et G, les zros de terminaison seront conservs.

PS/LANGAGES

Page 30

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les entres-sorties sur les voies standards

Largeur

fixe la largeur minimale (signe compris), du champ d'impression, cadrage droite. Si l'argument possde moins de caractres que le nombre indiqu, il sera complt par des caractres de remplissage (0 ou espaces).

Prcision prcd d'un point, le nombre maximal de caractres afficher droite du point dcimal. Interprtation du type h short int pour d, i, o, u x l long int pour d, i, o, u, x l double pour E, e, f, g, G L long double

PS/LANGAGES

Page 31

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les entres-sorties sur les voies standards

Exemples d'utilisations de printf Programme #include <stdio.h> main() { char chaine[10]="Monsieur"; int i; printf("%d\n",-12); printf("%5d\n",-12); printf("%05d\n",-12); printf("%-5d\n",-12); printf("%u\n",-12); printf("%o\n",12); printf("%o\n",-12); printf("%x\n",12); printf("%#x\n",12); printf("%#o\n",12); printf("%0X\n",12); printf("%X\n",-12); printf("%f\n",3.142); printf("%3f\n",3.142); printf("%#f\n",3.142); printf("%3.2f\n",3.142); printf("%1.2f\n",31.427); printf("%+1.2f\n",31.427); printf("%+1.2e\n",31.427); printf("%+5.1E\n",31.427); printf("%1.3g\n",31.427); printf("%#g\n",31.427000); printf("%+5.1g\n",31.427); printf("%+5.2g\n",31.427); printf("%c\n",'a'); printf("%3c\n",'a'); printf("%-3c\n",'a'); printf("%d\n",'a'); printf("%x\n",'a'); printf("%s\n","Bonjour, M"); printf("%4s\n","Bonjour, M"); printf("%.4s\n","Bonjour, M"); printf("%-4s\n","Bonjour, M"); printf("%.20s\n","Bonjour, M"); printf("%10s\n","Bonjour, M"); printf("%-10s\n","Bonjour, M"); printf("%10.4s\n","Bonjour, M"); printf("%-10.4s\n","Bonjour, M"); printf("%s\n",chaine); printf(chaine); printf("\nBonjour %n, M",&i); printf("\nla valeur de i est : %d",i); } b reprsente le caractre espace
PS/LANGAGES Page 32

Rsultat

-12 bb-12 -0012 -12bb 4294967284 14 37777777764 c 0xc 014 C FFFFFFF4 3.142000 3.142000 3.142000 3.14 31.43 +31.43 +3.14e+01 +3.1E+01 31.4 31.4270 +3e+01 bb+31 a bba abb 97 61 Bonjour, M Bonjour, M Bonj Bonjour, M Bonjour, M Bonjour, M Bonjour, M bbbbbbBonj Bonjbbbbbb Monsieur Monsieur Bonjour , M la valeur de i est : 9 Ralisation sur DPX20

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les entres-sorties sur les voies standards

Cas d'erreurs Dans le cas o le nombre d'arguments ne correspond pas au format, C cherche toujours satisfaire le contenu du format. printf ("%s",p,q ); printf ("%d %d",p ); q ne sera pas trait. affichage de deux valeurs l'une juste l'autre indtermine.

5.3 Les entres mises en forme Les fonctions scanf convertissent les donnes en entre suivant un format int fscanf(FILE *stream, const char *format, [arguments]); fscanf lit les donnes du flot stream d'aprs les spcifications de format et affecte les valeurs converties aux arguments suivants, chacun de ceux-ci devant tre un pointeur. Elle rend la main quand toute la chane format a t parcourue et retourne EOF si une erreur est survenue sinon le nombre d'objets convertis et affects. int scanf(const char *format, [arguments]); scanf quivaut fscanf(stdin,const char * format, [arguments]); int sscanf(char *s,const char * format, [arguments]); sscanf est similaire scanf, mis part que les caractres en entre sont extraits de la chane de caractres s. La chane de caractres format contient des spcifications de conversion utilises pour diriger l'interprtation de l'entre. Elle peut contenir: Des espaces ou des caractres de tabulation qui seront ignors. Des caractres ordinaires dont chacun est suppos s'identifier au caractre suivant du flot d'entre. Des spcifications de conversion, composes d'un %, d'un caractre facultatif de suppression d'affectation (*), d'un nombre facultatif donnant la largeur maximale du champ, des caractres h, l, L indiquant la largeur de l'emplacement de rception et d'un caractre de conversion.

PS/LANGAGES

Page 33

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les entres-sorties sur les voies standards

Caractres de conversion Caractre d i o u x e, f, g c Type de l'argument int * int * int * unsigned int* int * float * char * Converti en Entier sous forme dcimale Entier pouvant tre sous forme octal si prcd de 0, ou sous forme hexadcimale si prcd de 0x ou 0X Entier sous forme octale Entier non sign sous forme dcimale Entier sous forme hexadcimale Nombre en virgule flottante Les caractres suivants en entre sont placs dans le tableau indiqu jusqu' la largeur du champ (par dfaut 1) Chane de caractres ne contenant pas d'espace. Le caractre '\0' sera ajout. Pointeur comme l'imprimerait printf("%p"). Ecrit dans l'argument le nombre de caractres lus jusqu' prsent par cet appel de scanf. S'identifie la plus longue chane de caractres en entre compose de caractres faisant partie de l'ensemble entre crochets. Un caractre '\0' est ajout. S'identifie la plus longue chane de caractres en entre compose de caractres ne faisant pas partie de l'ensemble entre crochets. Un caractre '\0' est ajout.

s p n [...]

char * void * int * char *

[^...]

char *

Les caractres de conversion d, i, n , o, u et x peuvent tre prcds de h si l'argument est un pointeur sur un short ou par l si l'argument est un pointeur sur un long. Les caractres de conversion e, f, et g peuvent tre prcds de l si l'argument est un pointeur sur un double ou par L si l'argument est un pointeur sur un long double.

PS/LANGAGES

Page 34

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les entres-sorties sur les voies standards

Exemples d'utilisations de scanf Tous les appels scanf sont prcds d'un appel la fonction fflush(stdin) permettant de vider le buffer (prcaution trs utile). Programme #include <stdio.h> main() { int i,a,b,h,m,s; unsigned short sh; char c,d; char tab[20]; scanf("%d",&a); scanf("%2d",&a); scanf("%2d%2d",&a,&b); scanf("%d",&a); scanf("%d",&a); scanf("%d,%d",&a,&b); scanf("%d%d",&a,&b); scanf("%dplus%d",&a,&b); scanf("%c%c",&c,&d); scanf("%c%c",&c,&d); scanf("%cb%c",&c,&d); scanf("%2c%c",&c,&d); scanf("%*2c%d",&a); i=scanf("%d%*s%d%*s%d", &h,&m,&s); i=scanf("%[ON]",&c); i=scanf("%[ON]",&c); i=scanf("%[ON]",&c); scanf("%s",tab); scanf("%[^\n]",tab); scanf("%hu",&sh); scanf("%hu",&sh); } b reprsente le caractre espace Ralisation sur DPX20 Saisie Rsultat

1234 1234 123456 1234abc abc1234 12,34 12b34 3plus4 xby xyz xby xyz 1997 12heuresb30minutesb10sec Y O N Bonjour, Matre Bonjour, Matre 35000 70000

a = 1234 a = 12 a = 12 b = 34 a = 1234 a indtermin a = 12 b = 34 a = 12 b = 34 a=3b=4 c = 'x' d = 'b' c = 'x' d = 'y' c = 'x' d = 'y' c = 'x' d = 'z' a = 97 h = 12 m = 30 s = 10 i=3 c indtermin i = 0 c = 'O' i = 1 c = 'N' i = 1 tab = 'Bonjour,' tab = 'Bonjour, Matre' sh = 35000 sh = 4464

ML'oubli de l'oprateur d'adresse & est dangereux et indtectable pour le


compilateur: la valeur lue est crite n'importe o.

PS/LANGAGES

Page 35

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les entres-sorties sur les voies standards

Fonctionnement du scanf La fonction est mise en oeuvre ds que le retour chariot est frapp. Elle analyse les caractres saisis au clavier jusqu' ce qu'elle rencontre un type incompatible ou que la largeur maximale est atteinte. Elle stocke la valeur dans l'argument correspondant (c'est pour cela qu'elle doit connatre son adresse) et reprend l'analyse pour l'argument suivant. La fonction est interrompue ds qu'un caractre saisi est incompatible avec l'argument courant. En cas de saisie d'une chane de caractres, le caractre '\0' est ajout en fin de chane. La fonction traite les donnes partir du buffer. Si la fin de l'excution du scanf, le buffer n'est pas vide, les informations sont conserves et traites lors d'un autre appel d'un scanf (ou de toute autre fonction d'entre).

M D'o la ncessit de faire appel presque systmatiquement fflush(stdin) avant chaque appel une fonction d'entre utilisant le buffer.
Cas d'erreurs Dans le cas o le nombre d'arguments ne correspond pas au format, C cherche toujours satisfaire le contenu du format. Si la taille de l'argument est plus grande que le format, la valeur obtenue sera errone, dans le cas inverse, l'emplacement mmoire conscutif sera cras. Exemple: #include <stdio.h> main() { char tab1[10] = "", tab2[10] = ""; scanf("%s",tab1); } A l'excution, on saisit "abcdefghijklmnopq" tab1 contient "abcdefghij" tab2 contient "mnopq"

5.4 Les fonctions d'entres-sorties de caractres int fgetc(FILE *stream); fgetc retourne le caractre suivant du flot stream, lu comme un unsigned char (converti en int) ou bien EOF si erreur ou fin de fichier. char * fgets(char *s, int n, FILE *stream); fgets lit au plus les n-1 caractres suivants du flot stream et les place dans le tableau s. Le caractre '\0' est copi dans le tableau. int fputc(int c, FILE *stream); fputc crit le caractre c (converti en unsigned char) sur le flot stream et retourne le caractre crit ou EOF.

PS/LANGAGES

Page 36

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les entres-sorties sur les voies standards

int fputs(const char *s, FILE *stream); fputs crit la chane de caractres sur le flot stream. Elle retourne une valeur positive ou nulle ou EOF en cas d'erreur. int getc(FILE *stream); getc quivaut fgetc mis part que si c'est une macro, elle peut valuer stream plusieurs fois. int getchar(void); getchar quivaut getc(stdin). C'est une macro dfinie dans stdio.h char *gets(char *s); gets lit la ligne suivante en entre et la place dans le tableau s. Elle remplace le caractre de fin de ligne par '\0'. Cette fonction est souvent plus avantageuse pour la lecture d'une chane de caractre car elle ignore les espaces contrairement au scanf. int putc(int c, FILE *stream); putc quivaut fputc. int putchar(int c); putchar quivaut putc(c, stdout). C'est une macro dfinie dans stdio.h. int puts(const char *s); puts crit la chane de caractres s et un caractre de fin de ligne sur stdout. int ungetc(int c, FILE *stream); ungetc remet c (en unsigned char) sur le flot stream, o il sera retrouv la prochaine lecture. On ne peut remettre EOF dans le flot.

PS/LANGAGES

Page 37

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les entres-sorties sur les voies standards

5.5 Squences de contrle ansi En plus des codes ASCII, il est possible de grer l'cran et le curseur en utilisant un ensemble de codes dits "codes ANSI". Ces codes sont reconnus par les ordinateurs en chargeant un pilote spcifique (ANSI.SYS sous DOS). Les principaux codes ANSI sont les suivants: Rle Effacement ligne Effacement cran Positionnement du curseur Code ANSI x1B[K Efface partir du curseur x1B[2J x1B[l;cH Dplace le curseur la position l : numro de ligne c : numro de colonne x1B[#A x1B[#B x1B[#C x1B[#D x1B[#m Dplace de curseur de # lignes vers le haut Dplace de curseur de # lignes vers le bas Dplace le curseur de # colonnes droite Dplace le curseur de # colonnes gauche 30 Noir 31 Rouge 32 Vert 33 Jaune 34 Bleu 35 Magenta 36 Cyan 37 Blanc 40 Noir 41 Rouge 42 Vert 43 Jaune 44 Bleu 45 Magenta 46 Cyan 47 Blanc 0 Aucun 1 Gras 2 Rduit 3 Italique 4 Soulign 5 Clignotant 6 Rapide 7 Inverse 8 Cach

Dplacement du curseur - vers le haut - vers le bas - vers la droite - vers la gauche Couleurs des caractres

Couleurs de fond

x1B[#m

Attributs des caractres

x1B[#m

Exemples : ou

printf("\x1B[2J") printf("\33[2J");

{ efface l'cran } { efface l'cran }

Remarque : Sous TURBO C, ces possibilits sont rarement utilises car la bibliothque de TC fournit des fonctions d'affichage performantes dont les prototypes sont dans conio.h.
PS/LANGAGES Page 38

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les intructions en C

6. LES INSTRUCTIONS EN C
Le corps d'un programme est compos d'instructions. Ces instructions peuvent tre de deux types: - les instructions simples. - les instructions composes. Les instructions simples sont termines par un point virgule. On peut les crire sur plusieurs lignes (dconseill) en indiquant le saut de ligne par un antislash. Elles correspondent des affectations ou des appels de fonctions. instruction; Les instructions composes sont des squences d'instructions simples encadres par des accolades. Il s'agit en fait de la notion de bloc. { instruction; instruction; ...instruction; } ou prsentation plus claire et conseille { instruction; instruction; ... instruction; } Dans tout le chapitre, lorsque l'on emploiera le terme <instruction>, on dsignera une instruction simple ou une instruction compose. Une instruction de contrle est une instruction qui permet de rompre l'excution squentielle du programme. 6.1 L'instruction if-else if (condition) <instruction1> [else <instruction2>] Remarques: - la condition est obligatoirement entre parenthses. - la clause else si elle existe se rapporte au if le plus proche. Exemples: Instructions int i = 3, j = 5; if (i <j) printf ("%d < %d ", i, j); int i = 30, j = 5; if (i <j) printf ("%d < %d ", i, j); else printf ("%d >= %d ", i, j);
PS/LANGAGES Page 39

Excution

3<5

30 >= 5

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les intructions en C

Autre exemple: int nbcoeff; float somme_notes, moyenne; ... if (nbcoeff != 0) { moyenne = somme_notes / nbcoeff; printf("La moyenne est : %5.2f\n", moyenne); } else { printf("Calcul de la moyenne impossible\n"); printf("Recommencez\n"); } 6.2 L'instruction d'aiguillage switch Le switch est une instruction de choix multiple qui effectue un aiguillage direct vers des instructions en fonction d'une valeur discrte (rsultat de l'expression). switch (expression) { case expression_constante1 : <instruction> case expression_constante2 : <instruction> ... [default : <instruction>] } Les diffrents cas possibles servent d'tiquette; lorsque le traitement d'un cas est termin, l'excution continue par le traitement du cas suivant jusqu' ce que l'on sorte explicitement du switch.. On sort gnralement du switch grce aux instructions break ou return. Expression doit tre d'un type entier (ou caractre). Expression_constante est une constante entire et doit tre unique. Si plusieurs valeurs correspondent la mme squence d'instructions, les "case" sont numrs les uns la suite des autres. Si l'instruction default est prsente, elle doit contenir obligatoirement au moins une instruction. Exemple: switch(jour) /* jour =1 lundi; jour = 2 mardi etc...*/ { case 1: case 2: case 3 : case 4 : case 5 : puts("Au travail !"); break; case 6 : puts("Au jardin et "); case 7 : puts("Repos"); break; default : puts("Jour de la semaine non valide"); }
PS/LANGAGES Page 40

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les intructions en C

6.3 La boucle while while (expression) <instruction> Tant que la condition est ralise (condition non nulle), l'instruction est excute. L'instruction value expression avant de commencer la boucle. Si expression vaut 0 au dpart, l'instruction ne sera pas excute. Exemples: n = 100; while (n > 0) { instruction1; instruction2; n--; } n = 100; while (n--) { instruction1; instruction2; }

/* Cette instruction provoque l'excution */ /* des instructions 100 fois avec n initial valant 100 */

/* Cette instruction provoque l'excution /* des instructions 100 fois avec n initial valant 99

*/ */

6.4 La boucle for for(expr1 ; expr2 ; expr3) <instruction> Cette boucle peut tre remplace (sauf cas d'utilisation de continue) par la prcdente de la faon suivante: expr1; while (expr2) { <instruction> expr3; } En gnral, expr1 et expr3 sont des affectations ou des appels de fonction et expr2 est une expression boolenne. Aucune des trois expressions n'est obligatoire, mais les points virgules devront toujours tre prsents. Lorsque expr2 est absente, elle est quivalente 1 (VRAI). Exemples : int i, tableau[10]; for(i = 0; i < 10; i++) tableau[i] = 0; for(;;); /* boucle infinie */

M Dans le cas gnral, attention ne pas mettre de ; aprs le for car le ; termine
l'instruction donc le for.

PS/LANGAGES

Page 41

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les intructions en C

6.5 La boucle do...while do <instruction> while (expression); Au contraire du while et du for qui testent leur condition d'arrt en tte de boucle, le do while la teste la fin, aprs chaque passage dans le corps de la boucle qui s'excute donc au moins une fois. Exemple : int i = 0; do { i--; printf("i = %d\n", i); } while (i > 0);

Excution Affiche i = -1

6.6 Les instructions break et continue (sauts associes aux boucles) L'instruction break L'instruction break fournit un moyen de sortir (passer l'instruction suivant la boucle). Elle ne permet cependant que de sortir de la boucle la plus interne. Exemple: int i, tableau[10]; for (i = 0; i < 10; i++) { if (tableau[i] == 0) break; tableau[i] = tableau[i] + 1; }

/* sortie du for si tableau[i] == 0 */

L'instruction continue l'instruction continue fait dbuter l'itration suivante de la boucle, en sautant la squence d'instructions comprise entre le continue et la fin de la boucle. Exemple: int i, tableau[10]; for (i = 0; i < 10; i++) { if (tableau[i] == 0) continue; tableau[i] = tableau[i] + 1; }

/* on passe l'lment suivant (si i < 10) */

PS/LANGAGES

Page 42

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les intructions en C

6.7 L'instruction return return [expression]; L'instruction return permet de sortir d'une fonction. Exemples: return; return expression;

/* la fonction s'interrompt et rend la main la fonction appelante */ /* renvoie la valeur de l'expression la fonction appelante */

6.8 L'instruction goto goto label; L'instruction goto est associe un identificateur symbolique spcifiant l'endroit o doit tre effectu le branchement inconditionnel. Exemple: ... goto label; ... label: ... Son emploi doit tre vit au maximum car contraire l'esprit de programmation structure.

PS/LANGAGES

Page 43

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les fonctions

7. LES FONCTIONS
Une fonction est un sous-programme qui reoit ventuellement des arguments en entre (ces arguments sont toujours des valeurs) et qui retourne ventuellement une valeur d'un certain type vers la fonction appelante. L'criture d'une fonction se fait en plusieurs tapes: On dfinit ce dont elle a besoin en entre pour effectuer la tche qui lui incombe et ce qu'elle retourne en sortie. L'tape suivante consiste dfinir le prototype. Le prototype indique notamment le nombre et les types des arguments ncessaires ainsi que le type du rsultat renvoy. Le prototype est dclar avant la dfinition de la fonction. Il permet au compilateur de contrler la cohrence des appels. Enfin, la dfinition de la fonction consiste crire le corps de la fonction (coder le traitement attendu). Cette dfinition peut tre place dans le mme fichier source que la fonction appelante ou dans un autre fichier. Il n'y a pas de possibilit d'imbrication des fonctions. 7.1 Dfinition de fonction Syntaxe d'une fonction: [type-de-retour] nom-de-fonction([dclarations d'arguments]) { bloc } Type de retour Cette donne indique le type du rsultat renvoy par la fonction. Ce type peut tre simple (int, char ...) , une adresse (pour les tableaux) ou un type structur. Si la fonction ne renvoie aucun rsultat, on utilise le type 'void'. S'il n'est pas prcis. le type d'une fonction est par dfaut de type int. Nom-de-fonction Le nom d'une fonction peut tre n'importe quel identificateur valide. Dclarations d'arguments Ce sont les donnes venant de l'extrieur qui sont ncessaires l'excution de la fonction. Ils sont placs entre parenthses. Dans tous les cas, ces dernires devront tre prsentes. La position des paramtres est primordiale. Si la fonction reoit des paramtres, ils seront dclars sous la forme: type <identificateur>, type <identificateur>... Il est bien vident que le type dclar dans la fonction appele doit tre le mme que dans la fonction appelante.

PS/LANGAGES

Page 45

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les fonctions

Chaque paramtre est spar d'un autre par une virgule. Les paramtres sont : - de la classe automatique. - locaux la fonction o ils sont dclars. - crs par recopie dans la pile. - dtruits la fin de l'excution de la fonction. Bloc de la fonction Celui ci commence par une accolade ouvrante et se termine par une accolade fermante. A l'intrieur, on trouve, dans l'ordre : 1- La dclaration des variables locales. 2- Les instructions (ou blocs d'instructions) de la fonction. 7.2 Appel d'une fonction Une fonction est appele par son nom suivi de deux parenthses (obligatoires) contenant ventuellement des paramtres effectifs. Ces derniers peuvent tre soit des variables, soit des constantes, soit des expressions. Exemples: fonct1(); fonct2(a, 3); resultat = fonct3(i, j); fonct4(k+2, 4); 7.3 Passage de paramtres Les paramtres sont initialiss automatiquement avec les valeurs passes par l'appelant. A l'appel de la fonction avec les paramtres rels (effectifs), ceux-ci sont recopis dans les paramtres formels (de la fonction) et celle-ci travaille sur ces copies locales stockes dans la pile. A la sortie de la fonction, la zone de la pile occupe par les paramtres est libre sans sauvegarde des donnes. Les valeurs des paramtres redeviennent donc celles d'avant l'appel de la fonction. Les variables de la fonction appelante ne sont jamais modifies au retour de la fonction. Si une fonction reoit en argument la valeur d'une adresse, elle la stocke dans un pointeur. Elle peut ensuite, en utilisant le contenu de l'objet point, modifier la variable dont elle a reu l'adresse. La modification d'une variable par une fonction est ralise en passant un pointeur sur la variable. Au retour de la fonction, le pointeur lui-mme n'est pas altr.

PS/LANGAGES

Page 46

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les fonctions

7.4 Retour du rsultat Une fonction peut tre porteuse d'un rsultat aprs son excution. Ceci sera fait grce l'instruction return; Cette instruction interrompt le droulement de la fonction et excute le retour au programme appelant. Si le type de la variable figurant dans return est diffrent de celui de la fonction , la conversion est faite automatiquement. On ne peut pas trouver de return dans une fonction de type void. On peut trouver plusieurs return dans une fonction bien que ce soit contraire la notion de programme propre en programmation structure. 7.5 Prototypes des fonctions Placs en tte du programme (au minimum avant la premire fonction), les prototypes de fonctions sont facultatifs mais ont pour intrt: - de vrifier la validit (en quantit et qualit) des paramtres transmis aux fonctions. - d'utiliser les fonctions dans n'importe quel ordre. Le prototype d'une fonction est la dclaration de la fonction. Il n'y a l'excution aucun contrle ni sur le nombre ni sur le type des paramtres. D'o l'intrt d'utiliser un prototype systmatique afin de dtecter la compilation les erreurs non dceles l'excution.

PS/LANGAGES

Page 47

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les fonctions

7.6 Exemples Ecrire une fonction permettant de calculer le prix TTC en fonction du prix HT et de la TVA. 1re tape: la boite noire
float tva Calcul TVA float prix_ht float prix_ttc

2me tape : le prototype float calcul_prix_ttc (float tva, float prix_ht); ou float calcul_prix_ttc (float, float); Il n'est pas ncessaire d'indiquer au niveau du prototype le nom des arguments. Notez le ; obligatoire dans la dclaration du prototype. 3me tape : la dfinition de la fonction float calcul_prix_ttc (float tva, float prix_ht) { float ttc; ttc = (prix_ht * tva / 100) + prix_ht; return (ttc); } Utilisation de cette fonction: #include <stdio.h> /* prototypes des fonctions utilises par le programme */ float calcul_prix_ttc (float, float); main() { float prix_achat, tauxtva, prixtotal; puts ("Entrez le prix d'achat : "); scanf ("%f", &prix_achat); puts ("Entrez le taux de la TVA :"); scanf ("%f", &tauxtva); prixtotal = calcul_prix_ttc(tauxtva, prix_achat); printf("Le montant total est : %5.2f", prixtotal); }

PS/LANGAGES

Page 48

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les fonctions

void fonc(char ); main() { char c = 'a'; fonc(c); putchar(c); } void fonc(char car) { putchar(car); car = 'b'; putchar(car); } L'excution de ce programme donne aba. Explication: Pile Pile

Pile

Pile

car c

a a

car c

b a

Allocation de la variable c de main

Appel de fonc, allocation de car et copie de la valeur de c. putchar(car) a

Excution de car = 'b' Fin de la fonction C'est dans la pile qu'a Dpilement et retour lieu la modification au main putchar(car)b putchar(c)a

PS/LANGAGES

Page 49

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les tableaux et les pointeurs

8. LES TABLEAUX ET LES POINTEURS


Un tableau est une suite d'lments (suite d'emplacements mmoire) conscutifs de mme type. Pour dclarer un tableau, il faut indiquer: - son nom - le type de ses lments - sa classe d'allocation mmoire - sa dimension

M Les indices commencent zro. M Les dbordements ne sont pas grs par le compilateur.
Le langage C dispose de pointeurs, c'est--dire de variables destines contenir des adresses d'autres objets (variables, fonctions etc...). A priori, ces deux notions de tableaux et de pointeurs paraissent loignes. Mais il se trouve qu'en C, un identificateur de tableau est une constante pointeur. Ce n'est pas une lvalue. Toute opration que l'on peut effectuer par indexation sur des tableaux peut tre ralise l'aide des pointeurs. 8.1 Les tableaux un indice Exemple : crer un tableau de 10 notes; calculer et afficher la moyenne #include <stdio.h> main() { int i, somme = 0; float moyenne; float note[10];

/* le tableau de notes de note[0] note[9] */

for (i=0 ; i<10 ; i++) { printf("Donnez la note N%d : ",i+1); scanf("%f",&note[i]); somme += note[i]; } moyenne = somme / 10; printf("la moyenne est de %5.2f",moyenne); } Remarque : la construction suivante est correcte: #define MAX 10 ... int tab[MAX]; Par contre, elle ne serait pas correcte si on dfinissait N de la faon suivante: const int N = 10; car N n'est pas ici une expression constante. En effet, dans certaines conditions, selon l'implmentation, N pourrait tre modifi par une fonction qui recevrait un pointeur sur N.
PS/LANGAGES Page 51

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les tableaux et les pointeurs

8.1.1 Initialisation d'un tableau un indice La dclaration int tab[5] = {10,20,30,40,50}; place les entiers 10,20,30,40,50 dans chacun des 5 lments du tableau. Il est obligatoire de mentionner les dimensions du tableau la dclaration sauf s'il est initialis aussitt. Exemples: static char tabcart[] = {a,b,c,'\0'}; /* ou */ static char tabcart[] = "abc"; /* idem */ Si le nombre d'initialisateurs est infrieur la taille du tableau, les autres lments sont mis zro dans le cas des variables externes ou statiques, mais pour les variables automatiques, ils prennent une valeur quelconque. Il n'est pas possible d'initialiser un lment au milieu d'un tableau sans donner galement toutes les valeurs prcdentes. Exemple: static int tabent[10] = {2,3,4}; /* tableau de 10 entiers dont les 3 */ /* premiers ont pour valeur 2,3,4 */ /* les suivantes sont 0 */ Un tableau dclar static est initialis par dfaut 0 ou '\0' 8.2 Les tableaux multidimensionnels En langage C, un tableau multidimensionnel est en fait un tableau une seule dimension dont chaque lment est un tableau (uni ou multidimensionnel). Lorsque le compilateur rencontre une dclaration telle que int tab[5][9]; il rserve un tableau de 45 (5 * 9) lments. Un lment quelconque de ce tableau se note tab[3][2] ou tab[i][j] ou tab[i+2][j-1]. Les lments de ce tableau sont rangs en mmoire suivant l'ordre obtenu en faisant varier le dernier indice en premier. Exemple pour le tableau tab
tab[0][0] tab[0][1] tab[0][2] ... tab[1][0] tab[1][1] tab[1][2] ... tab[2][0] ...

Cet ordre a une incidence dans plusieurs circonstances: - lorsque l'on omet de prciser certaines dimensions du tableau - lorsque l'on dsire accder l'aide d'un pointeur aux diffrents lments d'un tableau. - lorsque l'un des indices dborde. tab[1][1] est une lvalue alors que tab[1] n'en est pas une. tab[1] est l'adresse du tableau tab[1] et est gal &tab[1][0]. 8.2.1 Initialisation d'un tableau multidimensionnel int tab[3][4] = { {1,2,3,4}, {5,6,7,8}, {9,10,11,12} }; ou plus simplement int tab[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; La premire forme consiste considrer le tableau tab comme form de 3 tableaux de 4 lments. La seconde exploite la manire dont sont rangs les lments en mmoire.
PS/LANGAGES Page 52

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les tableaux et les pointeurs

8.3 Les chanes de caractres Une chane de caractres est en fait un tableau particulier. Elle est donc dclare de la mme manire. char nom[10]; /* tableau de 10 caractres mais 9 caractres utiles */

Lors de l'initialisation de la chane de caractres, le systme ajoute systmatiquement un marqueur de fin de chane ('\0'). La chane doit pouvoir contenir ce caractre. Une chane dclare de longueur n contiendra n-1 caractres utiles.

MSi la chane n'est pas assez longue pour contenir le caractre ' \0 ' , ce dernier sera omis et la chane ne pourra pas tre utilise comme telle.
Exemple: main() { static char chaine[] = "bonjour"; /* ou static char chaine[8] = "bonjour"; */ printf("chane contient: %s\n",chaine); }

M On ne fait pas d'affectation de chanes.


Exemple: char nom[10]; nom = "bonjour"; /*Interdit car nom est une constante pointeur. On ne peut pas la modifier.*/

8.3.1 Fonctions de traitement sur les chanes de caractres Les fonctions sur les chanes, dclares dans le fichier d'en-tte string.h ont des noms qui commencent par str ou mem. Dans l'ensemble de ces fonctions, aucun contrle n'est effectu sur la longueur des zones rceptrices. En cas de manque de place, les emplacements contigus sont crass. 8.3.1.1 strcpy (string.h) char* strcpy(char *sl, const char *s2); Copie la chane s2, y compris '\0' dans s1 et retourne l'adresse de s1 ou NULL si la copie n'a pas pu se faire correctement. 8.3.1.2 strncpy (string.h) char* strncpy(char *sl, const char *s2, size_t n); Copie au plus n caractres de s2 dans s1 et retourne l'adresse de s1 ou NULL si la copie n'a pas pu se faire correctement. Complte par des '\0' si s2 comporte moins de n caractres.

PS/LANGAGES

Page 53

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les tableaux et les pointeurs

8.3.1.3 strcat (string.h) char* strcat(char *s1, const char *s2); Concatne la chane s2 dans s1 et retourne l'adresse de la chane rsultante (sl) ou NULL si l'opration n'a pas pu se faire correctement. Le caractre de fin de chane est copi automatiquement la fin de la nouvelle chane s1. La concatnation s'effectue partir du caractre de fin de chane de sl qui est effac. 8.3.1.4 strncat (string.h) char* strncat(char *s1, const char *s2, size_t n); Concatne au plus n caractres de la chane s2 dans s1 et retourne l'adresse de la chane rsultante (sl) ou NULL si l'opration n'a pas pu se faire correctement. Complte par des '\0' si s2 comporte moins de n caractres. 8.3.1.5 strcmp (string.h) int strcmp(const char *sl, const char *s2); Compare lexicographiquement deux chanes dans l'ordre des caractres dfinis par le code ASCII et renvoie un entier < 0 si sl < s2. = 0 si sl = s2. > 0 si sl > s2. La fonction effectue la comparaison partir du premier caractre de chaque chane et continue avec les caractres suivants jusqu ce que les caractres soient diffrents l'un de l'autre ou que l'une des chanes soit termine. 8.3.1.6 strncmp (string.h) int strncmp(const char *sl, const char *s2, size_t n); Compare au plus n caractres de s1 la chane s2 et renvoie un entier de la mme faon que strcmp. 8.3.1.7 strchr (string.h) char *strchr(const char * s1, int c); Retourne un pointeur sur la premire occurrence de c dans s1, ou NULL si c ne figure pas dans s1. c est un int converti en char. 8.3.1.8 strrchr (string.h) char *strrchr(const char * s1, int c); Retourne un pointeur sur la dernire occurrence de c dans s1, ou NULL si c ne figure pas dans s1. c est un int converti en char. 8.3.1.9 strspn (string.h) size_t strspn(const char *s1, const char *s2); Retourne le nombre de caractres du dbut de s1 constitu de caractres appartenant s2.

PS/LANGAGES

Page 54

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les tableaux et les pointeurs

8.3.1.10 strcspn (string.h) size_t strcspn(const char *s1, const char *s2); Retourne le nombre de caractres du dbut de s1 constitu de caractres n'appartenant pas s2. 8.3.1.11 strpbrk (string.h) char * strpbrk(const char * s1, const char *s2); Retourne un pointeur sur la premire occurrence dans s1 de n'importe quel caractre de s2, ou NULL si aucun n'y figure. 8.3.1.12 strstr (string.h) char *strstr(const char *s1, const char *s2); Retourne un pointeur sur la premire occurrence de la chane s2 dans la chane s1, ou NULL si elle n'y figure pas. 8.3.1.13 strlen (string.h) size_t strlen(const char *s1); Retourne la longueur de la chane s1, caractre nul non compris. 8.3.1.14 strerror (string.h) char *strerror(size_t n); Retourne un pointeur sur la chane correspondant l'erreur n, dfinie par l'implmentation. 8.3.1.15 strtok (string.h) char *strtok(char *s1, const char *s2); Recherche dans s1 des lexmes dlimits par des caractres appartenant s2. 8.3.1.16 memcpy (string.h) void *memcpy(void s1, const void s2, size_t n); Copie n caractres de s2 dans s1 et retourne s1. 8.3.1.17 memmove (string.h) void *memmove(char *s1, const char * s2, size_t n); Comme memcpy mais fonctionne aussi si les objets se chevauchent. 8.3.1.18 memcmp (string.h) int memcmp(const char *s1, const char *s2, size_t n); Compare les n premiers caractres de s1 s2. La valeur de retour se dtermine comme pour strcmp. 8.3.1.19 memchr (string.h) void *memchr(const char *s1, int c, size_t n); Retourne un pointeur sur la premire occurrence du caractre c (int converti en unsigned char) dans s1, ou NULL si c ne figure pas dans les n premiers caractres. 8.3.1.20 memset (string.h) void *memset (char *s1, int c, size_t n); Remplit les n premiers caractres de s1 par le caractre c et retourne s1.
PS/LANGAGES Page 55

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les tableaux et les pointeurs

8.4 Tableaux et Fonctions Le nom du tableau reprsente en fait l'adresse du tableau . Si nous voulons modifier un lment du tableau, il suffit de transmettre en paramtre le nom du tableau (ventuellement la taille). Exemple : void init(int tablo[], int ind); main() { int tab[10]; init(tab,10); } void init(int tablo[], int ind) { int i; for (i = 0 ; i < ind ; i++) tablo[i]=1; } Remarque : On aurait pu dclarer la fonction de la manire suivante: void init(int tablo[10], int ind) mais dans ce cas, la fonction init n'aurait pu travailler que sur un tableau de 10 entiers. Lorsque l'on passe un tableau plusieurs dimensions en argument une fonction, le nombre de lignes est sans importance car on passe en ralit son adresse. Par contre, la fonction doit connatre les autres dimensions pour connatre l'organisation du tableau. void ra_un(int t[][15], int nbl); main() { int tablo[10][15]; ra_un (tablo, 10); } void ra_un(int t[][15], int nbl) { /* fonction permettant la mise 1 de tableaux de 15 lments */ int i, j; for(i=0; i < nbl; i++) for(j=0; j < 15; j++) t[i][j] = 1; }

PS/LANGAGES

Page 56

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les tableaux et les pointeurs

8.5 Les pointeurs 8.5.1 Gnralits Un pointeur est une variable contenant l'adresse d'une autre variable ou d'une fonction. Il est utilis dans le passage de paramtres une fonction (possibilit de modifier les arguments points), la sauvegarde d'adresse ou pour le chanage d'lments. Un pointeur peut pointer sur n'importe quel type de variable (y compris un autre pointeur ou une fonction). La taille d'un pointeur (taille d'un entier "mot machine" est la mme quel que soit l'objet point.) 8.5.2 Dclaration - Utilisation <type> *<identificateur>; o <type> est le type de variable pointe. * : indique qu'il s'agit d'un pointeur Exemples: int *ptr_int; char *ptr_char; int *ptr1, *ptr2, *ptr3; int *adr; int n; n = 20; adr = &n; *adr = 30;

/* ins1 */ /* ins2 */ /* ins3 */

L'instruction (ins2) adr = &n affecte la variable pointeur adr l'adresse de n. L'instruction (ins3) *adr = 30 signifie: affecter la lvalue *adr la valeur 30. Or *adr reprsente l'entier ayant pour adresse adr. @ mmoire 2ff7fc10 n 2ff7fc14 adr

20

n 20 adr 2ff7fc10

n 30 adr 2ff7fc10

ins1

ins2

ins3

Si l'on avait ajout l'instruction (*adr)++; le contenu de n serait devenu gal 31. Ne pas oublier les parenthses (cf priorits et valuation des oprateurs). C'est la lvalue *adr que l'on incrmente.

PS/LANGAGES

Page 57

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les tableaux et les pointeurs

8.5.3 Pointeurs constants et pointeurs de constantes Soit la dclaration const int *p; On indique que l'on ne veut pas pouvoir modifier la valeur de l'objet point par p en passant par le pointeur. Exemple : int strlen(const char * s1); int *const p = &objet; Ici p pointera toujours sur le mme objet. const int * const q = &objet; q est un pointeur constant sur le mme objet. Via p, on peut modifier l'objet point, via q, on ne le peut pas. Exemple : int x = 10; int *const p = &x; const int * const q = &x; *p = 20 ; *q = 30 ; /* OK */ /* Erreur de compilation *q n'est pas une lvalue*/

8.5.4 Arithmtique des pointeurs Soit la dclaration int *adr; Une expression telle que adr + 1 a un sens pour le langage C. En effet, adr contient l'adresse d'un entier donc adr + 1 reprsente l'adresse de l'entier suivant (en fait incrmentation de sizeof(int)). De la mme faon, adr++ ou adr-- incrmente ou dcrmente l'adresse contenue dans adr. Les oprations utilisables sur les pointeurs sont: - l'addition ou la soustraction d'un pointeur et d'un entier. - la comparaison entre pointeurs de mme type. - l'affectation de pointeurs de mme type. - la soustraction entre pointeurs de mme type. Toutes les autres oprations sont interdites. L'affectation entre deux pointeurs de types diffrents ncessite un cast 8.5.5 L'allocation dynamique dans le tas A ct des objets dclars (statiques, automatiques, ...), il y a ceux allous dynamiquement dans une zone appele tas (ou heap). On accde ces objets obligatoirement par des pointeurs. Le tas est utilis pour la construction de structures de donnes complexes dont on ne connat pas priori la taille.
PS/LANGAGES Page 58

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les tableaux et les pointeurs

Le langage C comporte des fonctions (prototypes dans stdlib.h) pour allouer ou dsallouer de la mmoire. 8.5.5.1 malloc (stdlib.h) void *malloc(size_t size); malloc retourne un pointeur sur un espace mmoire reserv un objet de taille size, ou bien NULL si cette demande ne peut tre satisfaite. La mmoire alloue n'est pas initialise. 8.5.5.2 calloc (stdlib.h) void *calloc(size_t nobj, size_t size); calloc retourne un pointeur sur un espace mmoire rserv un tableau de nobj objets, tous de taille size, ou bien NULL si cette demande ne peut tre satisfaite. La mmoire alloue est initialise par des zros. 8.5.5.3 realloc (stdlib.h) void *realloc(void *p, size_t size); realloc change en size la taille de l'objet point par p. Si la nouvelle taille est plus petite que l'ancienne, seul le dbut du contenu de l'objet est conserv. Si la nouvelle taille est plus grande que l'ancienne, le contenu de l'objet est conserv. 8.5.5.4 free (stdlib.h) void free(void *p); free libre l'espace mmoire point par p; elle ne fait rien si p vaut NULL. p doit tre un pointeur sur un espace mmoire allou par une des fonctions prcdentes. p n'est pas modifi. 8.5.6 Les pointeurs gnriques Les fonctions calloc et malloc sont deux exemples de fonction retournant un pointeur gnrique (du type void *). Exemple: void demi(void *pt, char type); main() { int i=5; float x=15.4; demi(&i, 'i'); printf("%d\n", i); demi(&x, 'f'); printf("%f\n", x); return 0; } void demi(void *pt, char type) { switch(type) { case 'i' : *(int*)pt /= 2;break; case 'l' : *(long*)pt /=2;break; case 'f : *(float *)pt /=2.;break; } } Remarque : il est ncessaire d'effectuer un transtypage.

PS/LANGAGES

Page 59

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les tableaux et les pointeurs

8.5.7 Les pointeurs de fonction Une fonction elle-mme n'est pas une variable, mais il est possible de dfinir des pointeurs de fonctions que l'on peut affecter, placer dans des tableaux, passer en arguments des fonctions, etc... La dclaration suivante est une dclaration de pointeur de fonction qui renvoie un entier et qui admet deux entiers comme paramtre. int (*pointeur_fonc)(int, int);

M Attention l'utilisation des parenthses. La dclaration suivante correspond une


fonction qui retourne un pointeur sur un entier. int * pointeur2(int, int); Exemple: int plus (int a, int b); int moins (int a, int b); int operation (int a, int b, int (*ope)(int, int)); main() { int i = 10, j = 5; printf("La somme de %d et %d est %d\n", operation(a, b, plus)); printf("La diffrence de %d et %d est %d\n", operation(a, b, moins)); } int plus (int a, int b) { return a + b; } int moins (int a, int b) { return a - b; } int operation (int a, int b, int (*ope)(int, int)) { return ope(a,b); } 8.5.8 Les pointeurs et les arguments de fonction Comme dj signal dans le chapitre 7 (Les fonctions), les arguments une fonction sont passs par valeur. Ainsi le programme suivant ralise l'change des copies des arguments dans la pile. #include <stdio.h> void echange(int a, int b); main() { int i = 15, j = 25; printf("Valeurs de i = %d et de j = %d avant echange\n", i, j); echange(i, j); printf("Valeurs de i = %d et de j = %d aprs echange\n", i, j); } void echange(int a, int b) { int tampon ; tampon = a; a = b; b = tampon; }
PS/LANGAGES Page 60

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les tableaux et les pointeurs

Excution Valeurs de i = 15 et de j = 25 avant echange Valeurs de i = 15 et de j = 25 aprs echange En effet @ mmoire 2ff7fc00 i 2ff7fc04 j 2ff7fbe0 2ff7fbe4 2ff7fbc0 Dbut du main

15 25

i j a b tampon

15 25 15 25 Dbut de echange

i j a b tampon

15 25 25 15 15 Fin de echange

i j

15 25

Fin du main

Modifions maintenant le programme de la faon suivante: #include <stdio.h> void echange(int *pa, int *pb); main() { int i = 15, j = 25; printf("Valeurs de i = %d et de j = %d avant echange\n", i, j); echange(&i, &j); printf("Valeurs de i = %d et de j = %d aprs echange\n", i, j); } void echange(int *pa, int *pb) { int tampon ; tampon = *pa; *pa = *pb; *pb = tampon; } Excution Valeurs de i = 15 et de j = 25 avant echange Valeurs de i = 25 et de j = 15 aprs echange @ mmoire 2ff7fc00 i 2ff7fc04 j 2ff7fbe0 2ff7fbe4 2ff7fbc0 Dbut du main

15 25

i j

15 25

i j

25 15

i j

25 15

pa 2ff7fc00 pb 2ff7fc04 tampon Dbut de echange

pa 2ff7fc00 pb 2ff7fc04 tampon 15 Fin de echange

Fin du main

PS/LANGAGES

Page 61

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les tableaux et les pointeurs

8.5.9 Les pointeurs et les oprations sur les tableaux main() { int t[10] = {5,3,2,7,9,8,6,4,1,7}; int *pt = t; int i, j; i = *pt /* donc i = 5 valeur pointe par pt */ j = *(pt + 1); /* j = 3 valeur pointe par le suivant de pt */ pt + 1 est donc l'adresse de l'lment t[1]. De la mme faon: (pt + i) est l'adresse de t[i], donc (pt + i) est donc le mme objet que t[i] Les notations suivantes sont quivalentes t[i] L'oprateur + est commutatif *(t + i) *(i + t) L'oprateur [] est commutatif i[t] Dans le cas de tableaux multidimensionnels main() { int t[3][3] = { {1,3,5}, {2,4,6}, {7,8,9}}; int *p; /* p est un pointeur sur un entier */ int *ptr[3]; /* ptr est un tableau de pointeurs */ int (*pm)[3]; /* pm est un pointeur sur un tableau de 3 entiers */ p=t; /* MERREUR car p est un pointeur sur un entier */ /* et t est un pointeur sur un tableau de 3 entiers */ /* CORRECT */ /* affiche la valeur 3 */ /* affiche la valeur 5 */ /* CORRECT */ /* affiche la valeur 1 */

p = &t[0][0]; ptr[0] = p + 1; printf("%d\n", *(ptr[0])); ptr[1] = &t[0][2]; printf("%d\n", *(ptr[1])); pm = t printf("%d\n", *(pm[0])); }

Un tableau 2 dimensions est l'quivalent d'un pointeur sur les lignes de ce tableau. Si on augmente de 1 un tel pointeur, on doit se dcaler de la "largeur" d'une ligne (en fait le nombre de colonnes du tableau). Les notations suivantes sont quivalentes t[i][j] L'oprateur + est commutatif *(*(t + i)+j) *(j + *(t + i)) L'oprateur [] est commutatif j[i[t]]
PS/LANGAGES Page 62

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les tableaux et les pointeurs

8.5.10 Les pointeurs et les chanes de caractres La dclaration char *message; dclare un pointeur sur un caractre mais ne reserve pas de place en mmoire. char *message = "bonjour"; dclare un pointeur sur un caractre qui est initialis sur la chane "bonjour\0". message b o n j o u r \0

Les dclarations suivantes ne sont pas identiques: char message1[] = "bonjour"; char *message2 = "bonjour"; Dans le premier cas, il n'y a qu'un tableau de 8 caractres alors que dans le deuxime cas, il y a un pointeur et un tableau de 8 caractres. 8.5.11 Les tableaux de pointeurs La dclaration char *lignes[7]; dclare un tableau de 7 pointeurs sur un caractre. La dclaration char *mois[12] = { "janvier","fvrier","mars","avril","mai","juin", "juillet","aot","septembre","octobre","novembre","dcembre"}; dclare et initialise un tableau de pointeurs sur les chanes de caractres. mois 0 1 2 3 4 5 6 7 8 9 10 11

j f m a m j j a s o n d

a a v a u u o e c o

n v r r i i i p t v c

v r s i \0 n l t t o e e

i e r i e r \0 l \0 \0 l \0 e b m m

\0 \0

e m r b b

t b e r r

\0 r e \0 \0 e \0 e \0

On peut remarquer que la place mmoire est adapte au contenu des donnes. Ce qui ne serait pas le cas si on avait utilis la dclaration suivante: char mois[12][10] = { {"janvier"},{"fvrier"},{"mars"},{"avril"},{"mai"},{"juin"}, {"juillet"},{"aot"},{"septembre"},{"octobre"},{"novembre"},{"dcembre"}};

PS/LANGAGES

Page 63

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les tableaux et les pointeurs

8.5.12 Les paramtres du programme principal Il s'agit en fait d'un exemple d'utilisation des tableaux de pointeurs sur tableaux. Le programme principal peut recevoir des paramtres qui apparatront sur la ligne de commande aprs le nom du fichier excutable. Les paramtres possibles sont: un entier (argument count) signifiant nombre d'arguments. - argc un pointeur sur un tableau de chanes de caractres (argument vector) - argv Exemple d'utilisation : Ligne de commande : program bonjour, matre Par convention, argv[0] est le nom par lequel le programme a t appel (ici program) et par consquent argc vaut au moins 1. argv l l program\0 l bonjour,\0 l matre\0 0 Le programme suivant affiche de deux manires diffrentes les arguments passs program. #include <stdio.h> main(int argc, char *argv[]) { int i; for (i=1 ; i < argc; i++) printf("%s%s", argv[i], (i < argc - 1) ? " " : ""); putchar('\n'); /* ou encore */ while ( --argc > 0) printf("%s%s", *++argv, (argc > 1) ? " " : ""); putchar('\n'); }

PS/LANGAGES

Page 64

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les types numrs et structures

9. LES TYPES ENUMERES ET STRUCTURES


9.1 Les numrations Une numration est une liste de valeurs entires constantes que l'on appelle des numrateurs.. enum [<identificateur>] {<liste des constantes>}. La liste des constantes est une suite d'identificateurs spars par des virgules. Des valeurs sont automatiquement associes aux identificateurs dans un ordre croissant au pas de 1. Si aucune initialisation particulire n'est effectue, le premier identificateur est associ 0, le second 1 et ainsi de suite. Les valeurs associes aux identificateurs ne sont pas modifiables dans le code des programmes. Exemples : enum liste {zero, un, deux, quatre = 4, cinq}; enum liste var = zero; printf("%d",var); /* rsultat: 0 */ typedef enum {FAUX,VRAI} booleen; booleen choix; int a, b; scanf("%d %d", &a, &b); choix = (a > b); if (choix == FAUX) printf("%d est < ou = %d\n", a, b); else printf("%d est suprieur %d\n", a, b);

PS/LANGAGES

Page 65

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les types numrs et structures

9.2 Les structures 9.2.1 Gnralits - Dclaration Une structure est une collection de donnes regroupes dans une mme entit logique. Elles permettent de crer des types complexes partir de diffrents types dja connus et de les regrouper sous un mme nom. Les seules oprations permises sur les structures sont: - la copie - l'affectation - l'accs ses membres - la rcupration de son adresse. Par contre, les membres d'une structure sont utiliss comme n'importe quelle autre variable. Pas de comparaisons entre structures en raison de l'alignement des donnes et de la possibilit de prsence de bits de bourrage. struct [<nom struct> ] { typel <nom lmentl>, <nom lment2>; type2 <nom lment3>; } [<varl>, <var2> ... ]; Exemple : struct enreg { int numero, qte; float prix; }; Cette dclaration dfinit un modle de structure mais ne rserve pas de variable correspondant cette structure. Une fois le modle dfini, nous pouvons dclarer des variables du type correspondant. Exemple: struct enreg article; Dans cette dclaration, on rserve un emplacement mmoire de la taille d'une structure de type enreg. Il est possible de regrouper la dfinition du modle et la dclaration de la variable dans une seule instruction. Ainsi, l'opration prcdente aurait pu s'crire: struct enreg { int numero, qte; float prix; } article;

PS/LANGAGES

Page 66

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les types numrs et structures

Dans ce dernier cas, il est possible d'omettre le nom du modle (enreg) condition de ne pas avoir dclarer par la suite d'autres variables du mme modle. struct adr { int numero; char rue[30]; long codepostal; char ville[15]; }; struct compte { long numero; char nom[15]; char prenom[10]; struct adr adresse; } compte1; struct compte compte2; } compte1 et compte2 sont deux variables de type struct compte. Restriction : un champ ne peut pas tre de type fonction. typedef struct { int jour, mois, annee; } date; /* date est ici un alias de type, et non pas un vrai type personnalis comme auparavant */ date date_naissance; 9.2.2 Initialisation des structures 1) struct famille{ char nom[15]; char prenom[10]; int nb_enfants; } famille1 = {"DUPONT","Jean",3}; 2) 3) struct famille famille2 = famille1; struct famille famille3 = {"DURAND","Pierre",4};

9.2.3 Accs aux lments <identificateur de la variable>.<nom du champ> struct famille famille4; strcpy(famille4.nom , "DUPUIS"); strcpy(famille4.prenom, "Eric"); famille4.nb_enfants = 0;
PS/LANGAGES Page 67

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les types numrs et structures

9.2.4 Structures et Fonctions Une structure peut tre passe en argument une fonction et une fonction peut retourner une structure. La structure tant considre comme un tout, elle est passe en paramtre comme n'importe quel autre type de variable. Exemple : struct date { int jour, mois,annee; }; struct personne { char nom[20], prenom[15]; struct date date_naiss; }; /* fonction retournant une structure de type personne */ struct personne maj_pers(char name[],char pren[], struct date d_naiss) { struct personne tempo; tempo.date_naiss = d_naiss; strcpy(tempo.nom,name); strcpy(tempo.prenom, pren); return tempo; } main() { static struct date datel = {10,07,97}; struct personne persl; persl = maj_pers("TOTO","Jean",datel); printf("%s %s %d/%d/%d",persl.nom,pers1.prenom, persl.dat_naiss.jour, pers1.date_naiss.mois, pers1.date_naiss.annee); }

PS/LANGAGES

Page 68

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les types numrs et structures

9.2.5 Pointeurs sur une structure struct famille{ char nom[15]; char prenom[10]; int nb_enfants; } famille5; struct famille *pt; pt = &famille5;

MContrairement aux tableaux et aux chanes de caractres, le nom d'une variable


structure n'est pas assimil un pointeur constant (adresse). Il faut toujours utiliser l'oprateur & pour dsigner l'adresse d'une structure. Pour accder un champ d'une structure pointe par pt: strcpy((*pt).nom , "MARTIN"); ou strcpy(pt->nom, "MARTIN");

MAttention aux priorits


L'oprateur -> a une priorit suprieure l'oprateur ++ Exemples ++pt->nb_enfants; /* Incrmentation du champ nb_enfants */ (++pt)->nb_enfants; /* Incrmentation du pointeur */ 9.2.6 Structures rcursives Si le nombre d'objets (structures) n'est pas connu, une solution consiste utiliser une construction plus complexe qu'un tableau mais assez souple appele liste. Dans le cas d'une liste linaire, la cellule contient de plus l'adresse (un pointeur sur) de la cellule suivante. Dans une structure rcursive, un (ou plusieurs membres) fait rfrence la structure mme alors qu'elle n'est pas dfinie dans sa totalit. La construction est la suivante: struct cellule { int valeur; struct cellule *suivant; }; struct cellule *pt, *tete; tete 10 15 12 NULL Ainsi, connaissant la valeur de tete, on peut parcourir la liste du dbut la fin. La fin est signale par la valeur du champ suivant qui est gale NULL.
PS/LANGAGES Page 69

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les types numrs et structures

9.3 Les unions L'union permet de dclarer des objets polymorphes : objets qui peuvent changer de forme mais qui n'ont un moment donn qu'une forme et une seule. L'union permet de faire partager un mme emplacement mmoire par des variables de types diffrents. Elle permet : - d'conomiser des emplacements mmoire. - d'interprter de faons diffrentes un mme motif binaire Lors de la dclaration de la variable, la structure de donnes ne rserve en mmoire que la place ncessaire au stockage de la plus grande des entits qu'elle contient. union [nom] { typel varl; type2 var2; } var; Exemples: main() { union essai { long n; float x; }union1; printf("donner un nombre rel : "); scanf("%f",&union1.x); printf("en entier cel fait : %ld",union1.n); } Excution : donner un nombre rel : 1.23e4 en entier cel fait : 1178611712 union donnee { char nom[10]; int numero; float reel; }u1; u1 a 3 formes possibles: - un tableau de 10 caractres - un entier - un float

M Rappel : en C, pas de contrle d'accs aux champs.

PS/LANGAGES

Page 70

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les types numrs et structures

u1.numero = 256; printf("%x--%x--%x--%x\n", u1.nom[0], u1.nom[1], u1.nom[2], u1.nom[3]); u1.numero = 257; printf("%x--%x--%x--%x\n", u1.nom[0], u1.nom[1], u1.nom[2], u1.nom[3]); u1.numero = 278; printf("%x--%x--%x--%x\n", u1.nom[0], u1.nom[1], u1.nom[2], u1.nom[3]); Excution: 0--0--1--0 0--0--1--1 0--0--1--16

MAttention, ces rsultats sont valables sous UNIX. Dans le cas de processeur INTEL, avec le mme programme, on obtiendrait un rsultat diffrent du fait de l'inversion des octets. Sous TURBO C: 0--1--0--0 1--1--0--0 16--1--0--0
Autre exemple: typedef enum {cartesien, polaire} representation; typedef struct { float reel, imaginaire } rep_cartesien; typedef struc { float rho, theta} rep_polaire; typedef struct { representation rep; union { rep_cartesien champ_cart; rep_polaire champ_pol; } info; } complexe; complexe c; c.representation = polaire; c.info.champ_pol.rho = 10; Le champ rep sert de discriminant. 9.4 Les champs de bits Il est possible d'indiquer comment les champs d'une structure seront reprsents. Le nombre constant indique la longueur du champ de bits. typedef struct{ unsigned int code : 7; /* les 7 premiers bits */ unsigned int : 1; /* 1 bit inutilis */ unsigned int reg1 : 4; unsigned int reg2 : 4; } format; Les champs de bits n'ont pas d'adresse donc pas de pointeur sur ces champs.
PS/LANGAGES Page 71

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les types numrs et structures

9.5 typedef La directive typedef est employe pour dfinir un nouveau type partir des types existants. Les types ne sont pas rellement crs, mais les noms dfinis sont synonymes d'un type existant qui pourrait tre utilis leur place. Dans des cas simples, le typedef joue le rle similaire que la directive de compilation #define. Mais typedef permet de rsoudre des cas qui ne peuvent tre traits par le #define (ou lorsque la directive de compilation choue). L'utilisation de typedef permet de rendre des programmes plus facilement portables. La dfinition et la modification de type ne devra tre faite que dans un seul fichier. Il autorise galement une lecture ou une documentation du code plus aise en rendant les noms de types plus explicites. Syntaxe: typedef type identificateur; type: n'importe quel type de donnes dj existant. identificateur: l'identificateur en C, il peut tre utilis comme synonyme de type. Remarques: Les modificateurs de type (short, long, signed, unsigned) ne peuvent tre utiliss sur des types dfinis par un typedef, mme si ceux-ci sont synonymes d'un type qui les admet. typedef int entier; unsigned entier nombre;

M -

/* dclaration illgale */

Plusieurs synonymes d'un type peuvent tre dfinis dans un mme typedef, ceux-ci sont alors spars par des virgules.

L'instruction typedef permet de dfinir n'importe quel type, y compris les types pointeurs, fonctions et tableaux. Exemples: typedef enum {FAUX,VRAI} booleen; typedef char chaine[128], *pointeur_char, fonction_char(); typedef int (* pointeur_sur_fonction)(); booleen trouve=FAUX; chaine ch1, ch2; pointeur_char pt_ch; pt_ch = &ch1[127]; pointeur_sur_fonction fonction_quitter;

MAttention l'abus des typedef qui peut rendre un code difficilement comprhensible et donc produire l'effet contraire de celui escompt.

PS/LANGAGES

Page 72

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les fichiers

10. LES FICHIERS


10.1 Gnralits Le langage C reconnat un fichier comme une suite squentielle d'octets. Le dplacement dans ce fichier se fait l'aide d'un pointeur. La gestion des entres-sorties est dcrite dans stdio.h . Le nombre maximum de fichiers pouvant tre ouverts simultanment et la taille de la mmoire tampon alloue pour chacun d'eux sont dfinis dans stdio.h (FOPEN_MAX et BUFSIZ). En C, tous les fichiers sont considrs comme un ensemble amorphe d'octets. Il n'y a pas de notion de fichiers typs.

MSous DOS, il existe deux types de fichiers:


fichier binaire fichier texte copie des octets copie des octets avec interprtation des caractres spciaux <Retour chariot> et <Nouvelle ligne>

Sous UNIX, uniquement des fichiers binaires. Pour favoriser la portabilit, TURBO C propose une variable _fmode dfinie dans <stdlib.h> qui peut prendre l'une des deux valeurs suivantes: O_BINARY ou O_TEXT qui sont dfinies dans <fcntl.h>. On peut galement ajouter b dans le mode d'ouverture pour spcifier un fichier binaire (ou t pour un fichier texte par dfaut). 10.2 Les fonctions de gestion de fichier Il existe deux classes de fonctions permettant de grer les fichiers. Les fonctions de niveau 1 ("LOW LEVEL") ont les caractristiques suivantes: -Elles sont proches et donc dpendantes du systme d'exploitation. -Les fichiers sont identifis par un simple numro. -Les informations sont manipules en binaire et n'offrent pas de possibilit de formatage. Les fonctions de niveau 2 ("STREAM") ont les caractristiques suivantes: -Elles font appel aux fonctions de niveau 1. -Les fichiers peuvent tre manipuls soit en binaire soit faire l'objet de formatage. -Les fichiers sont identifis par un pointeur de type FILE. Ce type dsigne un modle de structure dfini dans <stdio.h> et sera utilis lors de chaque manipulation du fichier. Ces fonctions utilisent ou mettent jour des variables globales dcrites dans des fichiers d'en-tte. La gestion des erreurs ncessite l'inclusion du fichier <errno.h> . La principale variable utilise est errno : Quand une erreur survient lors d'un appel systme la variable errno prend une valeur indiquant le type d'erreur. Cette variable peut tre consulte tout moment grce la fonction perror().

PS/LANGAGES

Page 73

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les fichiers

10.3 Les fonctions de niveau 1 10.3.1 open (fcntl.h) Ouvre un fichier. int open (char * chemin, int omode, [int amode]); Renvoie un handle dsignant le fichier pour les oprations ultrieures. L'argument omode dfinit le mode d'ouverture. mnmonique opration O_APPEND Ecriture partir de la fin du fichier O_BINARY Ouverture en mode binaire (DOS) O_CREAT Si le fichier n'existe pas, il est cr O_NDELAY Ne se bloque pas si l'ouverture ncessite un dlai O_RDONLY Ouverture en lecture seule O_RDWR Ouverture en lecture et criture O_TEXT Ouverture en mode texte (DOS) O_TRUNC Ouvre un fichier dj existant en rduisant sa taille 0. Le fichier doit possder des droits d'criture O_WRONLY Ouvre en criture seule Plusieurs paramtres omode peuvent tre spcifis, ils sont alors spars par le caractre '|'. Certains paramtres sont exclusifs les uns des autres (Exemple O_TEXT et O_BINARY). L'argument amode n'est utilis que si l'option O_CREAT a t invoque. Il correspond sous UNIX aux valeurs utilises par chmod (valeurs comprises entre 0000 et 0777). Sous DOS, l'argument amode peut prendre les valeurs suivantes: mnmonique opration S_IWRITE Ecriture seule S_IREAD Lecture seule S_IREAD | S_IWRITE Lecture et criture autorises

10.3.2 eof (fcntl.h) Dtermine si le pointeur de fichier associ au handle a atteint la fin du fichier. int eof (int handle); Renvoie 1 si la fin de fichier est dtecte et 0 sinon.

PS/LANGAGES

Page 74

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les fichiers

10.3.3 read Lecture dans un fichier. int read (int handle, void * buffer, unsigned nb); Lit dans un fichier rfrenc par handle, nb octets qui sont stocks dans le tampon buffer. La lecture commence la position courante du pointeur de fichier dans le fichier. Sous DOS, si le fichier est ouvert en mode texte, la squence CR-LF est remplace par un caractre newline et le caractre CTRL-Z (^Z) est interprt comme caractre de fin de fichier. La fonction renvoie: le nombre d'octets rellement lus. 0 en cas de dtection de fin de fichier -1 en cas d'erreur (errno prend la valeur EBADF ou EACCES). 10.3.4 write Ecriture dans un fichier int write (int handle, void * buffer, unsigned nb); Ecrit nb octets pris dans buffer dans le fichier rfrenc par handle. L'criture commence la position courante dans le fichier. Sous DOS, si le fichier est ouvert en mode texte, le caractre newline est remplac par la squence CR-LF et un caractre CTRL-Z (^Z) est ajout en fin de fichier. La fonction renvoie: le nombre d'octets rellement crits. -1 en cas d'erreur (errno prend la valeur EBADF ou EACCES). 10.3.5 close (fcntl.h) int close (int handle); Ferme le fichier dsign par handle. Les tampons systme associs sont vids. La fonction renvoie: 0 en cas de succs -1 en cas d'erreur (errno prend la valeur EBADF) 10.3.6 lseek (fcntl.h) Attention, cette fonction n'est pas dans la norme ANSI. long lseek (int handle, long depl, int orig); Dplace le pointeur de fichier de depl octets partir de orig. Orig peut prendre les valeurs suivantes: 0 SEEK_SET depuis le dbut de fichier. 1 SEEK_CUR depuis la position courante du pointeur 2 SEEK_END depuis la fin de fichier

PS/LANGAGES

Page 75

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les fichiers

10.4 Les fonctions de niveau 2 10.4.1 fopen (stdio.h) Ouvre un fichier. FILE* fopen(char *nomfic,char *mode); La fonction retourne un pointeur sur le fichier en cas de russite sinon NULL. Les diffrents modes d'accs sont en criture (w, w+), en lecture (r, r+) ou en ajout(a, a+). Il peut tre exprim soit sous la forme d'une variable soit sous la forme d'une constante. Mode daccs w Fichier Nexiste pas Cre le fichier Ouvre en criture Existe Dtruit lancien Cre le fichier Ouvre en criture Mode daccs w+ Fichier Nexiste pas Cre le fichier Ouvre en E/S Existe Dtruit lancien Cre le fichier Ouvre en E/S w+ r+ r Erreur Ouvre en lecture a Cre le fichier Ouvre en criture Ouvre en ajout en fin de fichier

r+ Mise jour Erreur Ouvre en E/S

a+ Cre le fichier Ouvre en E/S Ouvre en E/S en fin de fichier

a+

cration pour mise jour mise jour en lecture/criture. Le fichier doit exister. Il n'est pas possible de raliser une lecture aprs une criture (et vice-versa) sans se repositionner (par un fseek ou autre). Il est possible d'enchaner plusieurs lectures (ou critures) conscutives. extension et mise jour. L'criture n'est possible qu'en fin de fichier.

Sous DOS, il est possible d'ajouter b (pour binaire) ou t (pour texte). Exemple : ptr_fic = fopen ("ESSAI.DAT", "wb+"); 10.4.2 fclose (stdio.h) Ferme un fichier et force l'criture sur disque du contenu du tampon associ au flux. int fclose (FILE *ptr_fic); La fonction retourne 0 si la fermeture s'est bien passe ou EOF dans le cas contraire.

PS/LANGAGES

Page 76

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les fichiers

10.4.3 fseek (stdio.h) Positionne le pointeur de fichier. int fseek(FILE *ptr_fic, long int depl, int orig); depl orig : Taille du dplacement en octets (+ ou - ) : Origine du dplacement

Orig peut prendre les valeurs suivantes: 0 SEEK_SET depuis le dbut de fichier. 1 SEEK_CUR depuis la position courante du pointeur 2 SEEK_END depuis la fin de fichier SEEK_SET, SEEK_END et SEEK_END sont dfinies dans <stdio.h>. La fonction retourne 0 si le dplacement a pu se faire ou diffrent de 0 dans le cas contraire. Cette fonction permet de grer les fichiers en accs direct, le dplacement du pointeur tant gr par l'utilisateur qui doit connatre la position dans le fichier de la donne recherche. 10.4.4 rewind (stdio.h) Positionne le pointeur en dbut de fichier. void rewind(FILE *ptr_fic,); Idem fseek (ptr_fic, 0L, 0); 10.4.5 ftell (stdio.h) Retourne la position courante du pointeur d'un fichier. long int ftell (FILE *ptr_fic); La fonction retourne la position courante ou EOF s'il y a une erreur. La position courante du pointeur est le dplacement en octets par rapport au dbut du fichier. 10.4.6 feof (stdio.h) Dtecte une fin de fichier. int feof (FILE *ptr_fic); La fonction retourne une valeur non nulle (vraie) si l'indicateur de fin de fichier a t dtect lors de la dernire opration de lecture. Il est ncessaire d'avoir tent de lire au del de la fin de fichier pour que la fonction renvoie un rsultat non nul.

PS/LANGAGES

Page 77

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les fichiers

10.4.7 ferror (stdio.h) Dtecte les erreurs. int ferror(FILE *ptr_fic); La fonction retourne une valeur non nulle (vraie) lorsqu'une erreur est dtecte. La fonction teste la possibilit de lire ou d'crire dans un fichier et met jour la variable errno. 10.4.8 clearerr (stdio.h) Rinitialise l'indicateur d'erreur. void clearerr (FILE *ptr_fic); La fonction rinitialise les indicateurs d'erreurs et de fin de fichier. 10.4.9 perror (stdio.h) Affiche les messages d'erreurs systmes. void perror(char *s); La fonction affiche dans un premier temps le message 's' suivi de deux points puis le message correspondant la dernire erreur systme. 10.4.10 getw (stdio.h) Lit un entier (un mot machine) dans un flux. int getw(FILE *ptr_fic); En cas de russite, la fonction renvoie l'entier suivant dans le fichier d'entre . En cas d'erreur (fin de fichier ... ) la fonction renvoie EOF (-1 ). EOF tant un entier autoris, il est ncessaire de recourir la fonction ferror( ) pour tester la russite de getw( ). 10.4.11 putw (stdio.h) Ecrit un entier (un mot machine) dans un flux. int putw(int var,FILE *ptr_fic); La fonction renvoie l'entier crit en cas de russite. En cas d'erreur (fin de fichier ...) la fonction renvoie EOF (-l). EOF tant un entier autoris, il est ncessaire de recourir la fonction ferror( ) pour tester la russite de putw( ). 10.4.12 fflush (stdio.h) int fflush(FILE *stream); Sur un flot de sortie, fflush provoque l'criture des donnes mises en mmoire tampon. Sur un flot d'entre, son effet est indfini. Elle retourne EOF lors d'une erreur, zro sinon.

PS/LANGAGES

Page 78

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les fichiers

10.4.13 fwrite (stdio.h) Ecrit des donnes dans un fichier, partir de la position courante du pointeur dans le fichier ( sauf en mode ajout). size_t fwrite(void *donnee, size_t taille, size_t n, FILE *ptr_fic); void *donnee size_t taille size_t n : Adresse de la donne crire. : Taille en octets de la donne crire. : Nombre de donnes crire (si n > 1 c'est le nombre total d'octets transfrs = n x taille ).

La fonction retourne le nombre de donnes crites ( si ce nombre est diffrent de n, alors une erreur s'est produite lors de l'criture 10.4.14 fread (stdio.h) Lit des donnes depuis un fichier, partir de la position courante du pointeur dans le fichier. size_t fread(void * donnee, size_t taille, size_t n, FILE *ptr-fic); void *donnee size_t taille size_t n : Adresse o sera stocke la donne. : Taille en octets de la donne lire. : Nombre de donnes lire (si n > 1 c'est le nombre total d'octets transfrs = n x taille )

La fonction retourne le nombre de donnes lues ( si ce nombre est diffrent de n, alors une erreur s'est produite lors de la lecture). 10.4.15 Autres fonctions de lecture-criture On peut galement utiliser les fonctions standards d'entres-sorties dcrites dans le chapitre 5 (Les entres-sorties sur les voies standards) telles que fputc, fgetc, fscanf, fprintf, fgets, fputs. 10.4.16 Autres oprations sur les fichiers FILE *freopen(const char *filename, const char *mode, FILE *stream); freopen ouvre le fichier et lui associe un flot. Elle retourne un flot, ou NULL en cas d'erreur. S'utilise pour changer les fichiers associs stdin, stdout ou stderr. int remove(const char *filename); remove dtruit le fichier. Retourne une valeur diffrente de zro en cas d'chec. int rename(const char *oldname, const char *newname); rename change le nom du fichier oldname en newname. Retourne une valeur diffrente de zro en cas d'chec. FILE *tmpfile(void); tmpfile cre un fichier temporaire dans le mode "wb+" qui sera automatiquement dtruit lors de sa fermeture ou lors de la fin normale du programme. tmpfile retourne un flot ou NULL si le fichier ne peut pas tre cr.
PS/LANGAGES Page 79

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Les fichiers

char *tmpnam(char s[L_tmpnam]); tmpnam(NULL) cre une chane de caractres qui n'est pas le nom d'un fichier existant et retourne un pointeur sur un tableau statique interne. tmpnam(s) stocke cette chane dans s et renvoie s. tmpnam gnre un nom diffrent chaque appel. int setvbuf(FILE *stream, char *buf, int mode, size_t size); setvbuf contrle la mise en mmoire tampon pour le flot stream. Il faut l'appeler avant la premire lecture ou criture sur ce flot. Diffrentes valeurs de mode: _IOFBF provoque un tamponnage complet _IOLBF provoque un tamponnage par lignes de fichier texte _IONBF pas de tamponnage void setbuf(FILE *stream, char *buf); Si buf vaut NULL, setbuf stoppe la mmoire tampon pour le flot stream. Sinon, elle quivaut (void) setvbuf(stream, buf, _IOFBF, BUFSIZ).

PS/LANGAGES

Page 80

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Autres fonctions de la bibliothque standard

11. AUTRES FONCTIONS DE LA BIBLIOTHEQUE STANDARD


11.1 Les tests de catgories de caractres : <ctype.h> Le fichier d'en-tte <ctype.h> contient des dclarations de fonctions destines tester les caractres. Pour chaque fonction, l'argument et la valeur de retour sont de type int. Ces fonctions retournent une valeur non nulle (VRAI) si l'argument c remplit la condition ou 0 sinon.
isalnum(c) isalpha(c) iscntrl(c) isdigit(c) isgraph(c) islower(c) isprint(c) ispunct(c) isspace(c) isupper(c) isxdigit(c) isascii(c) isalpha(c) ou isdigit(c) est vrai isupper(c) ou islower(c) est vrai caractre de contrle chiffre dcimal caractre imprimable sauf l'espace lettre minuscule caractre imprimable y compris l'espace caractre imprimable diffrent de l'espace, des lettres et des chiffres espace, saut de page, fin de ligne, retour chariot, tabulations lettre majuscule chiffre hexadcimal vrai si c est compris entre 0 et 127 (fonction non ANSI)

Les fonctions suivantes permettent des conversions


int toascii(int c) int tolower(int c) int toupper(int c) convertit c en un entier compris entre 0 et 127 (fonction non ANSI) convertit c en minuscule convertit c en majuscule

Si c est une lettre majuscule, tolower(c) retourne la lettre minuscule correspondante sinon elle retourne c. Si c est une lettre minuscule, toupper(c) retourne la lettre majuscule correspondante sinon elle retourne c.

PS/LANGAGES

Page 81

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Autres fonctions de la bibliothque standard

11.2 Les fonctions mathmatiques : <math.h> Le fichier d'en-tte <math.h> contient des dclarations de fonctions et de macros mathmatiques. Pour chaque fonction, x et y sont de type double, i est de type int et toutes les valeurs de retour sont de type double.
sin(x) cos(x) tan(x) asin(x) acos(x) atan(x) atan2(y,x) sinh(x) cosh(x) tanh(x) exp(x) log(x) log10(x) pow(x,y) sqrt(x) ceil(x) floor(x) fabs(x) ldexp(x,n) frexp(x, int *exp) modf(x, double *ip) fmod(x,y) sinus de x cosinus de x tangente de x arc sinus de x dans l'intervalle [- /2, /2], x [-1,1] arc cosinus de x dans l'intervalle [0, ], x [-1,1] arc tangente de x dans l'intervalle [- /2, /2] arc tangente de y/x dans l'intervalle [- , ] sinus hyperbolique dex cosinus hyperbolique dex tangente hyperbolique dex fonction exponentielle de x = e x logarithme nprien de x = ln(x), x > 0 logarithme base 10 = log 10(x), x > 0 xy x, x 0 le plus petit entier suprieur ou gal x, exprim en double le plus grand entier infrieur ou gal x, exprim en double valeur absolue de x : |x| x.2n spare x en une fraction dans l'intervalle[1/2,1] qui est retourne et une puissance de 2 qui est place dans *exp. spare x en ses parties entire place dans *ip et fractionnaire qui est retourne. reste de x/y, exprim en virgule flottante

PS/LANGAGES

Page 82

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Autres fonctions de la bibliothque standard

11.3 Les fonctions utilitaires : <stdlib.h> Le fichier d'en-tte <stdlib.h> contient des dclarations de fonctions traitant la conversion des nombres et l'allocation de mmoire. double atof(const char *s); convertit une chane s en un double. int atoi(const char *s); convertit une chane s en un int. long atol(const char *s); convertit une chane s en un long. double strtod(const char *s, char **endp); convertit le dbut de la chane s en un double. Elle place dans *endp un pointeur sur la partie non convertie sauf si endp vaut NULL. long strtol(const char *s, char **endp, int base); convertit le dbut de la chane s en un long. Elle place dans *endp un pointeur sur la partie non convertie sauf si endp vaut NULL. Si base vaut 0, la base est 8,10 ou 16. unsigned long strtoul(const char *s, char **endp, int base); idem strtol mis part les types des arguments et du rsultat. int rand(void); retourne un entier pseudo-alatoire compris entre 0 et RAND_MAX. void srand(unsigned int seed); prend seed comme amorce de la nouvelle squence de nombres pseudo-alatoires. L'amorce initiale vaut 1. void abort(void); provoque un arrt anormal du programme. void exit(int status); provoque l'arrt normal du programme. L'criture des tampons associs aux fichiers ouverts est force. Les flots ouverts sont ferms. La faon dont status est retourn dpend de l'implmentation. void atexit(void (*fcn)(void)); enregistre que la fonction fcn devra tre appele lors de l'arrt normal du programme. Retourne une valeur non nulle si cet enregistrement n'est pas ralisable. int system(const char *s); passe la chane s l'environnement pour que celui-ci l'excute. La valeur de retour dpend de l'implmentation. char *getenv(const char *name); retourne la chane d'environnement associe name.

PS/LANGAGES

Page 83

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Autres fonctions de la bibliothque standard

void bsearch(const void *key, const void *base, size_t n, size_t size, int (*cmp)(const void *keyval, const void *datum)); recherche parmi base[0]..base[n-1] un objet s'identifiant la cl *key. La fonction cmp doit retourner une valeur ngative, nulle ou positive en fonction de la comparaison des cls. Les objets du tableau base doivent tre rangs dans l'ordre croissant. bsearch retourne un pointeur sur un objet identique la cl ou NULL s'il n'en existe aucun. void qsort(void *base, size_t n, size_t size, int (*cmp)(const void *, const void *)); trie dans l'ordre croissant un tableau base[0]..base[n-1] d'objets de taille size. La fonction cmp doit retourner une valeur ngative, nulle ou positive en fonction de la comparaison des cls. int abs(int n); retourne la valeur absolue de son argument de type int. long labs(long n); retourne la valeur absolue de son argument de type long. div_t div(int num, int denom) calcule le quotient et le reste de la division de num par denom. Le quotient et le reste sont placs dans les champs quot et rem de type int d'une structure de type div_t. ldiv_t ldiv(long num, long denom); calcule le quotient et le reste de la division de num par denom. Le quotient et le reste sont placs dans les champs quot et rem de type long d'une structure de type ldiv_t. 11.4 Les listes variables d'arguments : <stdarg.h> Le fichier d'en-tte <stdarg.h> permet une fonction d'utiliser une liste d'arguments de nombre et de types inconnus. void va_start(va_list ap, lastfix); type va_arg(va_list ap, type); void va_end(va_list ap); Les macros de la famille va_arg, va_end et va_start fournissent un moyen portable d'accder ces listes d'arguments. _ va_start fait pointer ap sur le premier argument fourni la fonction. _ va_arg gnre une expression de mme type et valeur que le prochain argument transmis (un des arguments variables). _ va_end facilite le travail de retour normal de la fonction appele. ap lastfix type Pointe sur la liste va_list transmise ap de va_arg doit tre le mme que celui initialis par va_start Nom du dernier paramtre fixe transmis Sert va_arg pour drfrencer et situer l'lment suivant

PS/LANGAGES

Page 84

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Autres fonctions de la bibliothque standard

11.5 Les fonctions de traitement de la date et de l'heure : <time.h> Le fichier d'en-tte <time.h> contient des dclarations de types et de fonction servant manipuler l'heure et la date. clock_t et time_t sont des types arithmtiques qui reprsentent des instants et struct tm contient les composants d'une heure calendaire: int tm_sec; int tm_min; int tm_hour; int tm_mday; int tm_mon; int tm_year; int tm_wday; int tm_yday; int tm_isdst; secondes aprs la minute (0-61) minutes aprs l'heure (0-59) heures depuis minuit (0-23) jour du mois (1-31) mois depuis janvier (0-11) anne depuis 1900 jours depuis dimanche (0-6) jours depuis le 1er janvier (0-365) drapeau de l'heure d't (positif si heure d't nul sinon)

clock_t clock(void); retourne le temps d'utilisation par le programme depuis le dbut de son excution. time_t time(time_t *tp); retourne l'heure calendaire actuelle. *tp reoit aussi cette valeur de retour. double difftime(time_t time2, time_t time1); retourne la dure time2 - time1, exprime en secondes. time_t mktime(struct tm *tp); convertit l'heure locale contenue dans la structure *tp en heure calendaire. Retourne l'heure calendaire. char *asctime(const struct tm *tp); convertit l'heure reprsente dans la structure *tp en une chane de la forme: Sun Jan 3 15:14:17 1997\n\0 char *ctime(const time_t *tp); convertit l'heure calendaire *tp en heure locale. struct tm *gmtime(const time_t *tp); convertit l'heure calendaire en Temps Universel. struct tm *localtime(const time_t *tp); convertit l'heure calendaire *tp en heure locale.

PS/LANGAGES

Page 85

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Autres fonctions de la bibliothque standard

size_t strftime(char *s, size_t smax, const char *fmt, const struct tm *tp); transforme les informations de date et d'heure contenues dans *tp suivant le format fmt (analogue un format de printf) et place le rsultat dans s. strftime place au maximum smax caractres dans s. Caractres de conversion pour strftime: %a abrviation du jour de la semaine %A nom complet du jour de la semaine %b abrviation du mois %B nom complet du mois %c reprsentation locale de la date et de l'heure %d jour du mois (01-31) %H heure (0-23) %I heure (01-12) %j numro du jour dans l'anne (001-366) %m numro du mois (01-12) %M minutes (00-59) %p quivalent local de AM ou PM %S secondes (00-59) %U numro de la semaine dans l'anne %w numro du jour de la semaine (0-6) 0 = dimanche %W numro de la semaine dans l'anne %x reprsentation locale de la date %X reprsentation locale de l'heure %y anne dans le sicle (00-99) %Y anne y compris le sicle %Z nom du fuseau horaire %% %

11.6 Les limites dfinies par l'implmentation : limits.h, values.h et float.h Le fichier d'en-tte <limits.h> dfinit des constantes pour les tailles des types entiers. Ces valeurs sont fonction de l'implmentation. CHAR_BIT CHAR_MAX CHAR_MIN INT_MAX INT_MIN LONG_MAX LONG_MIN SCHAR_MAX SCHAR_MIN SHRT_MAX SHRT_MIN UCHAR_MAX UINT_MAX ULONG_MAX USHRT_MAX
PS/LANGAGES

8 UCHAR_MAX ou SCHAR_MAX 0 ou SCHAR_MIN +2147483647 -2147483648 +2147483647 -2147483648 +127 -128 +32767 -32768 255 4294967295 4294967295 65535
Page 86

bits par caractre valeur maximum d'un char valeur minimum d'un char valeur maximale d'un int (-(INT_MAX+1)) valeur maximale d'un long (-(LONG_MAX+1)) valeur maximale d'un signed char (-(SCHAR_MAX+1)) valeur maximale d'un short (-(SHRT_MAX+1)) valeur maximale d'un unsigned char valeur maximale d'un unsigned int valeur maximale d'un unsigned long valeur maximale d'un unsigned short

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Autres fonctions de la bibliothque standard

Valeurs dfinies dans <values.h> HIBITS HIBITI HIBITL MAXSHORT MAXINT MAXLONG MAXFLOAT MINDOUBLE MINFLOAT M_PI M_SQRT2 ((short)-32768) ((int)-2147483648) ((long)-2147483648) ((short)~HIBITS) ((int)~HIBITI) ((long)~HIBITL) ((float)3.40282346638528860e+38) 4.94065645841246544e-324 ((float)1.40129846432481707e-45) 3.14159265358979323846264338327950288 1.41421356237309504880168872420969808 constantes relatives l'arithmtique en Signification le plus grand nombre float le plus petit nombre float prcision en chiffres dcimaux mode d'arrondi pour l'addition base de la reprsentation (base 2) nombre de chiffres de la mantisse le plus petit x ; 1.0 + x 1.0 le plus petit exposant pour 10n le plus grand exposant n pour que FLT_RADIXn-1 soit reprsentable le plus grand nombre double le plus petit nombre double prcision en chiffres dcimaux nombre de chiffres de la mantisse le plus petit x ; 1.0 + x 1.0 le plus petit exposant pour 10n le plus grand exposant n pour que FLT_RADIXn-1 soit reprsentable

Le fichier <float.h> contient des dclarations de virgule flottante. Constantes Valeurs courantes FLT_MAX 3.4028234663852886e+38F FLT_MIN 1.1754943508222875e-38F FLT_DIG 6 FLT_ROUNDS ( fp_read_rnd() ) FLT_RADIX 2 FLT_MANT_DIG 24 FLT_EPSILON 1.1920928955078125e-7F FLT_MIN_EXP -125 FLT_MAX_EXP 128 DBL_MAX DBL_MIN DBL_DIG DBL_MANT_DIG DBL_EPSILON DBL_MIN_EXP DBL_MAX_EXP 1.7976931348623158e+308 2.2250738585072014e-308 15 53 2.2204460492503131e-16 -1021 1024

PS/LANGAGES

Page 87

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Autres fonctions de la bibliothque standard

11.7 Le fichier errno.h Le fichier errno.h contient les diffrentes valeurs que peut prendre la variable errno.
EPERM ENOENT ESRCH EINTR EIO ENXIO E2BIG ENOEXEC EBADF ECHILD EAGAIN ENOMEM EACCES EFAULT ENOTBLK EBUSY EEXIST EXDEV ENODEV ENOTDIR EISDIR EINVAL ENFILE EMFILE ENOTTY ETXTBSY EFBIG ENOSPC ESPIPE EROFS EMLINK EPIPE EDOM ERANGE ENOMSG EIDRM ECHRNG EL2NSYNC EL3HLT EL3RST ELNRNG EUNATCH ENOCSI EL2HLT EDEADLK ENOTREADY EWRPROTECT EFORMAT ENOLCK ENOCONNECT ESTALE EDIST Operation not permitted No such file or directory No such process interrupted system call I/O error No such device or address Arg list too long Exec format error Bad file descriptor No child processes Resource temporarily unavailable Not enough space Permission denied Bad address Block device required Resource busy File exists Improper link No such device Not a directory Is a directory Invalid argument Too many open files in system Too many open files Inappropriate I/O control operation Text file busy File too large No space left on device Invalid seek Read only file system Too many links Broken pipe Domain error within math function Result too large No message of desired type Identifier removed Channel number out of range Level 2 not synchronized Level 3 halted Level 3 reset Link number out of range Protocol driver not attached No CSI structure available Level 2 halted Resource deadlock avoided Device not ready Write-protected media Unformatted media No locks available no connection no filesystem old, currently unused AIX errno

PS/LANGAGES

Page 88

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Utilitaires

12. UTILITAIRES
12.1 Gestion de projets Le langage C s'appuie sur la structuration au niveau des fichiers. Le programmeur va devoir recompiler les diffrents fichiers chaque fois qu'il effectuera des modifications sur l'un de ces fichiers. Il apparat intressant de ne recompiler que les fichiers ayant subi des modifications. Pour cela on utilisera un gestionnaire de projets: le make. 12.1.1 Make L'utilitaire make s'appuie sur un fichier texte appel makefile qui indique les dpendances, ou relations entre les diffrents fichiers. Par dfaut, make cherche dans le rpertoire de l'utilisateur un fichier makefile ou Makefile. Si le fichier makefile n'existe pas dans le rpertoire courant, la commande suivante $make prog gnre la commande suivante: cc prog.c -O -o prog En l'absence de fichier makefile, des rgles implicites sont appliques. Exemple de fichier makefile:
# make de maintenance de l'application prog prog: initial.o princ.o cc -o prog initial.o princ.o initial.o: initial.c initial.h princ.h cc -c initial.c princ.o: princ.c princ.h cc -c princ.c

Lancement: $make -f makefile prog ou plus simplement $make Ce fichier est constitu d'une ligne de commentaires commenant par #, de premires lignes de dpendances directes et de deuximes lignes de commandes de compilation (commenant imprativement par une tabulation). Le rsultat de la compilation sera le fichier prog. Ce programme dpend de initial.o et princ.o. Si l'un de ces fichiers est plus rcent que prog, la ligne de commande cc -o prog initial.o princ.o sera excute pour recrer un nouvel excutable. De la mme faon, initial.o dpend de initial.c, initial.h et princ.h

PS/LANGAGES

Page 89

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Utilitaires

12.1.1.1 Syntaxe des fichiers makefile Commentaire jusqu' la fin de la ligne # $(chaine1) vaut chaine2 chaine1=chaine2 Remplace val1 par val2 dans chaine1 $(chaine1:val1=val2) Exemples: OFILE=x.o y.o z.o ... applic:$(OFILE) cc $(OFILE) -O -o applic

$(OFILE:.o=.c)

vaut x.c y.c z.c

12.1.1.2 Les macros prdfinies le nom complet du fichier cible $@ le nom du fichier sans suffixe $* liste des fichiers pr-requis dont la date est postrieure celle de l'objectif $? valu seulement quand l'objectif est membre d'une librairie $% le nom du fichier dpendance dans les rgles implicites $<

12.1.1.3 Options du make nom du fichier de description du makefile -f nom afficher les macros et les rgles prdfinies -p afficher les commandes et ne pas les excuter -n les codes d'erreurs des commandes excutes sont ignors -i ne tient pas compte des rgles implicites -r debug : des informations sont donnes sur les fichiers et les dates -d les commandes sont excutes sans tre affiches -s

PS/LANGAGES

Page 90

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Utilitaires

12.1.2 Gestion de projets sous TURBO C TURBO C permet de grer des projets selon deux modes: En mode ligne de commande avec un utilitaire make qui fonctionne sensiblement comme le make d'UNIX. Au sein de l'EDI grce au menu PROJECT. Au sein de l'EDI, le gestionnaire de projets permet: L'assemblage automatique de tous les modules L'dition des diffrents fichiers sources ou d'en-tte associs au projet La cration automatique d'un fichier de type makefile qui a pour extension .PRJ. Lorsque l'on reconstruit un projet, le gestionnaire met jour automatiquement les informations du fichier projet. Utilisation du gestionnaire de projets Choisir un nom pour le projet (dans PROJECT/OPEN PROJECT). Ajouter les noms de fichiers source dans la boite de dialogue PROJECT/ADD ITEM. Lancer la compilation au moyen de COMPILE/MAKE. Ensuite, vous pouvez ajouter (ou enlever) des fichiers a votre projet dfinir les options pour un fichier du projet visualiser les fichiers inclus 12.2 L'utilitaire LINT Cet utilitaire permet de vrifier la syntaxe d'un fichier source c. Il n'effectue pas de modifications et ne gnre pas de programme excutable. Il vrifie la syntaxe des instructions et signale celles qui pourraient poser un problme de portabilit. Il effectue un contrle approfondi des types de donnes. Utilisation: lint fichier.c Pour les diffrentes options se reporter la documentation ou l'aide en ligne.

PS/LANGAGES

Page 91

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Utilitaires

12.3 Dbogage des programmes sous UNIX UNIX propose des dbogueurs (SDB ou DBX plus convivial). Il est souvent ncessaire de passer par une phase de mise au point d'un programme. Le dbogueur symbolique est un outil qui aide la mise au point des programmes C en permettant d'examiner des variables de poser des points d'arrts d'excuter pas pas etc... 12.3.1 Utilisation de DBX Pour dbogger un programme, il faut le compiler avec l'option -g $cc -g fichier.c -o ficexec puis excuter le programme DBX de la faon suivante: $dbx ficexec (a.out par dfaut) On peut dfinir les options par dfaut ou des alias en utilisant le fichier .dbxinit Exemple: alias p print alias rr rerun alias c cont alias d dump set $listwindow=20 Le prompt de dbx est (dbx). 12.3.2 Lancement et sortie r[arguments] s rerun c n q ou quit

Lancement [avec arguments] Excution pas pas (step) Relance aprs une excution Continue l'excution jusqu'au prochain point d'arrt Excute la ligne suivante. Next quivaut Step over Sortie de dbx

PS/LANGAGES

Page 92

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Utilitaires

12.3.3 Pose de points d'arrts stop 100 stop at 100 if var == 2 stop in fonc status delete num delete all clear num

Pose un point d'arrt la ligne 100 Pose un point d'arrt la ligne 100 si var vaut 2 Pose un point d'arrt sur la premire instruction de fonc Affiche tous les points d'arrts Supprime le point d'arrt de la ligne num Supprime tous les points d'arrts Supprime le point d'arrt de la ligne num

12.3.4 Principales commandes d'dition Edite les 10 lignes suivantes (ou 20 si $listwindow=20) (dbx)list ou l Edite la ligne numro n (dbx)l n Edite les lignes de 10 15 (dbx)l 10, 15 Recherche avant et dition de la ligne contenant nom (dbx)/nom/ Recherche arrire et dition de la ligne contenant nom (dbx)?nom? Edite sous 'vi' le programme en debug (dbx) e

12.3.5 Edition du source en cours de debug Edite la ligne courante en excution (dbx) l $ Affiche la ligne qui sera excute aprs la ligne courante (dbx) l @ Edite les +- n lignes qui encadrent la ligne courante (dbx) l $-n, $+n

12.3.6 Examen des variables du programme Affiche l'adresse de var (dbx)print &var Affiche le contenu de var (dbx)print var Si var est un pointeur, affiche ce qui est point par var (dbx)print *var (dbx)print st.membre Affiche le membre de la structure st Affiche tablo (dbx)print tablo (dbx)print tablo [0..2] Affiche les lments de 0 2 de tablo

12.3.7 Commandes diverses (dbx)assign var = val (dbx)print sizeof var (dbx)where (dbx)whereis x (dbx)whatis x (dbx)dump (dbx)alias (dbx)set (dbx)trace

Assigne la valeur val la variable var Affiche la taille en octets de var Affiche l'empilement des fonctions appeles Indique o est dclare la variable x (fichier.main.x) Indique la nature de la variable x (int x) Affiche les noms et les valeurs des variables Liste des alis de dbx Liste des variables internes de dbx Trace l'excution du programme instruction par instruction pour une ligne, une fonction ou le programme

PS/LANGAGES

Page 93

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Utilitaires

12.4 Dbogage des programmes sous TURBO C TURBO C, grce au multi-fentrage permet de faire apparatre sur l'cran plusieurs fentres dont l'une est rserve au dbogage. TURBO C propose plusieurs manires de suivre l'excution d'un programme. 12.4.1 Principales commandes F7 (ou menu RUN/TRACE INTO) Chaque frappe sur la touche F7 fait excuter la ligne d'instructions. La prochaine ligne excuter est mise en surbrillance. Lorsque la ligne d'instruction excute est un appel de fonction, cette dernire est excute en mode pas pas. F8 (ou menu RUN/STEP OVER) Idem que F7 mais lorsque la ligne d'instruction est un appel de fonction, la fonction est excute d'un coup. On peut basculer de F7 F8 et inversement. F4 (ou menu RUN/GO TO CURSOR) Excute le programme jusqu' la ligne sur laquelle est positionn le curseur. On peut mettre fin l'excution du programme par CTRL-BREAK. 12.4.2 Actions sur les variables A l'aide du menu DEBUG/ADD WATCH ou CTRL-F7, on peut entrer le nom des variables que l'on souhaite visualiser. On peut galement valuer (et/ou modifier) une variable au cours du dbogage l'aide de la commande menu DEBUG/EVALUATE ou CTRL-F4. On peut aussi inspecter une variable l'aide de menu DEBUG/INSPECT. Le contenu affich indique alors le nom de la variable, son adresse et le type de donne. 12.4.3 Points d'arrts Comme dans tous les dbogueurs, on peut mettre en place des points d'arrts l'aide de la commande menu DEBUG/BREAKPOINTS... ou DEBUG/TOOGLE BREAKPOINTS (CTRL-F8). Ces points d'arrts peuvent tre conditionnels (menu BREAKPOINTS... puis EDIT). 12.5 Gestionnaires de bibliothques Une bibliothque est un groupe de fichiers gr comme un fichier unique par le systme. Chaque membre de la bibliothque est dsign par son nom d'origine. Un fichier de tout peut tre rang en bibliothque. Utilisation : les binaires objets (.o) utiliss par l'diteur de liens.

PS/LANGAGES

Page 94

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Utilitaires

12.5.1 L'utilitaire ar (UNIX) Gnralement les bibliothques sont dots du suffixe .a. Exemples : /lib/libc.a bibliothque standard /lib/libm.a bibliothque mathmatique Utilisation $ar option nom_bibli [liste_fic] Options d r u q t v x

suppression de membre(s) du fichier remplacement d'un membre contrle de la date ajoute un membre en fin de fichier affiche le contenu de la bibliothque mode verbose (bavard) extraction d'un membre

Exemple: $ar -t /usr/libc.a $ar ru biblio.a fonc1.o

affiche le contenu de libc.a remplace fonc1.o dans biblio.a

12.5.2 L'utilitaire TLIB (TURBO C) Permet de crer ou de maintenir des bibliothques partir de modules objets .OBJ TLIB nom_biblio commande [liste_fic] Commande + * -+ ou +-* ou *-

ajoute le (ou les) modules spcifis retire de la bibliothque le module dsign extraction de la bibliothque sans effacer le module remplace le module dans la bibliothque extraction de bibliothque et efface le module

PS/LANGAGES

Page 95

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Annexes

13. ANNEXES
13.1 UTILISATION DE VI 13.1.1 Prsentation de VI VI travaille selon deux modes: un mode commande divis en deux sous-modes - dplacement du curseur, mode insertion, copies, effacement etc.. - un autre sous-mode introduit par : qui permet d'accder certaines commandes spciales un mode texte utilis pour entrer les diffrents caractres du fichier.

13.1.2 Spcification du type de terminal VI doit connatre le type de terminal utilis. On peut le spcifier l'aide de la variable TERM de l'environnement. Exemple: $ TERM=vt320;export TERM

13.1.3 Configuration de VI VI est paramtrable: on peut modifier certains de ses comportements (indentation, numrotation des lignes, tabulations etc..) par la commande set. Exemples :set all : affiche toutes les options de configuration. :set num : affiche la numrotation des lignes sous VI. On peut paramtrer VI de faon permanente en spcifiant les options dans le fichier $HOME/.exrc ou dans la variable d'environnement EXINIT. Exemple de fichier de configuration: set nu # affiche la numrotation des lignes set showmode # affiche sur la dernire ligne l'tat : INPUT MODE/ REPLACE MODE etc... set autoindent # met en oeuvre l'auto-indentation set ts=4 # fixe la tabulation 4 caractres

13.1.4 Entre dans VI $ vi [-options] [nom(s) de fichier(s)] Si on appelle VI sans paramtre, il prsente une page vierge. On peut alors charger un fichier avec la commande :e nom_fich Si le fichier existe, la premire page de celui-ci est affiche. Si le fichier spcifi n'existe pas, il est cr dans le rpertoire courant et VI affiche une page blanche. Si plusieurs noms de fichiers sont spcifis, VI affiche d'abord le premier. Pour accder au suivant :n Pour basculer entre les deux derniers fichiers dits : CTRL-A ou :e# Lorsqu'un fichier est dit, on peut charger un deuxime fichier (:e nouveau) et basculer de l'un l'autre grce CTRL-A ou :e#<RC>

PS/LANGAGES

Page 97

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Annexes

Les principales options -R VI ouvre le fichier en lecture seule pour consultation +5 VI ouvre le fichier spcifi la ligne N5 +/mot VI ouvre le fichier la premire occurrence de mot. -r VI peut rcuprer des donnes (un fichier) perdu la suite d'un incident (coupure de courant, fausse manuvre etc..)

13.1.5 Sortie de VI Avec sauvegarde: ZZ ou :x :w suivi de :q ou :wq Sans sauvegarde: :q si pas de modifications :q! si modifications Vers le Shell :! commande ou :sh $ commandes $ <CTRL>D 13.1.6 Cration et insertion de texte Insertion de texte dans une ligne a<texte><ESC> Insertion de texte derrire le curseur. <ESC> sortie du mode Insertion i<texte><ESC> Insertion de texte avant le curseur. A<texte><ESC> Insertion de texte en fin de ligne. I<texte><ESC> Insertion de texte en dbut de ligne Insertion de lignes o<texte><ESC> O<texte><ESC>

Insertion d'une ligne la suite de la ligne courante Insertion d'une ligne avant la ligne courante

PS/LANGAGES

Page 98

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Annexes

13.1.7 Dplacement du curseur dans un fichier Sur caractres ou h ou backspace ou l ou espace ou k ou j ou linefeed Sur lignes ^ $ 0 6| CR -

Dbut de ligne Fin de ligne (zro) Dbut de ligne physique 6me caractre de la ligne courante Dbut de ligne suivante Dbut de ligne prcdente

Sur cran H Home (premire ligne de l'cran) L Dernire (Last) M Milieu Sur mots w W Dbut du mot suivant b B Dbut du mot courant e E Fin du mot courant Les commandes majuscules ne tiennent compte que des espaces et des tabulations Les commandes minuscules tiennent compte des signes de ponctuation. Sur phrase ( Dbut de la phrase courante ) Fin de la phrase courante Une phrase se termine par . ! ou ? Sur paragraphe { Dbut du paragraphe } Fin du paragraphe. Un paragraphe se termine par une ligne blanche. Sur numro de ligne 10G ou :10 se place ligne N 10 G ou :$ se place sur la dernire ligne du fichier Sur emplacement marqu (2 simples quotes) permet de se dplacer au dernier endroit marqu par ma permet de nommer un emplacement (ici a) a permet de se repositionner au dbut de la ligne marque `a permet de se repositionner lendroit du marquage (par exemple au milieu de la ligne)

PS/LANGAGES

Page 99

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Annexes

13.1.8 Dplacement du curseur dans la fentre z. Centrer sur la ligne courante z<CR> Ligne courante en haut de l'cran zLigne courante en bas de l'cran ^D ^U ^F ^B ^L Un demi cran vers la bas (Down) Un demi cran vers le haut (Up) Un cran (vers le bas Forward) Un cran (vers le haut Backward) Raffrachit l'cran (aprs une modification)

13.1.9 Recherche de chanes de caractres La recherche se fait par /chane en avant dans le fichier ?chane en arrire dans le fichier Prochaine recherche n N // ?? %

dans le mme sens qu'avant dans le sens inverse en avant dans le fichier en arrire dans le fichier recherche le frre pour () , [] , {}

13.1.10 Destruction de texte Destruction de caractres x Dtruit le caractre courant 3x Dtruit 3 caractres X Dtruit le caractre prcdent Destruction de lignes dd ou :d<RC> Dtruit la ligne courante 5dd ou :5d<RC> Dtruit 5 lignes d$ ou D Dtruit la fin de la ligne Destruction de mots dw 3dw ou d3w d/chane

Dtruit le mot courant Dtruit 3 mots Dtruit jusqu' la premire occurrence de chane (non comprise)

PS/LANGAGES

Page 100

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Annexes

13.1.11 Remplacement de texte rb Remplace le caractre courant par 'b' R<texte><ESC> Mode REFRAPPE jusqu' ce que l'utilisateur frappe <ESC> s<texte><ESC> Remplace le caractre courant par le texte frapp jusqu' <ESC> 3s<texte><ESC> Remplace 3 caractres par le texte frapp jusqu' <ESC> S<texte><ESC> Dtruit la ligne courante et passe en mode INSERTION ~ Modifie le caractre courant (MAJUSCULE/minuscule) Changement de mots cw<texte><ESC> Remplace le mot par "texte". Le mot remplacer est dlimit par $ c3w<texte><ESC> Remplace les 3 mots par "texte" C ou c$ Remplace jusqu' la fin de la ligne c/chane Remplace jusqu' chane non comprise 13.1.12 Annulation ou rptition d'une commande Annulation d'une commande Annule l'effet de la dernire directive de u changement (mme pour elle) Annule tous les changements effectus dans la U ligne courante Rptition d'une commande Effectue nouveau la dernire commande de . (point) modification de texte Etat du fichier Donne le nom, l'tat du fichier, le numro de ^G ou ligne, o est le curseur et le pourcentage de texte :f au-dessus du curseur.

PS/LANGAGES

Page 101

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Annexes

13.1.13 Copie et dplacement de texte Copie de texte La directive y (yank) copie sans dtruire l'objet dans un buffer sans nom. y3w met les 3 mots suivants dans le buffer Y ou yy met la ligne courante dans le buffer 5yy met 5 lignes dans le buffer Il suffit de se positionner et de rcuprer le contenu du buffer sans nom par les directives p ou P p Copie la dernire copie aprs l'objet du mme type P Idem avant l'objet du mme type Autres moyens pour copier du texte: :5,8t25 les lignes 5 8 sont copies aprs la ligne 25 :5,8co25 idem Dplacement de texte Pour chaque directive x ou d , VI mmorise la partie dtruite dans un buffer sans nom jusqu' la prochaine destruction Il suffit de se positionner et de rcuprer le contenu du buffer sans nom par les directives p ou P p Copie la dernire copie aprs l'objet du mme type P Idem avant l'objet du mme type Autre moyen pour dplacer du texte: :5,8m25 les lignes 5 8 sont dplaces aprs la ligne 25 13.1.14 Insrer le contenu d'un autre fichier La directive :r permet l'insertion d'un autre fichier dans le buffer :r fic le contenu de fic est insr l'emplacement du curseur 13.1.15 Insrer le rsultat d'une commande dans un fichier :r! commande permet d'insrer le rsultat de la commande partir de la position courante du curseur 13.1.16 Copie d'une partie d'un fichier dans un autre fichier :adresse1,adresse2w fichier.tmp copie le texte compris entre les lignes adresse1 et adresse2 dans "fichier.tmp" :/chane1/,/chane2/w fichier2 copie les lignes comprises entre chane1 et chane2 dans "fichier2" 13.1.17 Les buffers nomms (de la forme "lettre) "a5yy met 5 lignes dans le buffer a "f3yy met 3 lignes dans le buffer f "ap insre le contenu du buffer a aprs le curseur
PS/LANGAGES Page 102

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Annexes

13.1.18 Regroupement de lignes J permet de regrouper des lignes (supprime le caractre fin de ligne de la ligne courante) 13.1.19 Echange de buffers nomms entre fichiers :w sauvegarde du fichier courant "b5yy mmorisation de 5 lignes dans le buffer nomm b :e fic.nou dition d'un nouveau fichier "bp copie des 5 lignes du buffer nomm b aprs la ligne courante :e# retour au fichier de dpart (ou <CTRL>A) 13.1.20 Rcupration des objets dtruits L'diteur sauvegarde les 9 derniers blocs de texte supprims dans un jeu de registre numrots de 1 9 "1p rcupration de la dernire destruction ". rcupration de l'avant-dernire destruction "3p rcupration de la destruction qui prcde l'avant-dernire 13.1.21 Recherche et remplacement de chanes de caractres Substitution de la 1re occurrence de "chane1" par "chane2" pour les lignes d'adresse1 adresse2 :[adresse1[,adresse2]]s/chane1/chane2/[options] Substitution de la 1re occurrence de "chane1" par "chane2" pour la ligne courante :/chane1/s//chane2/ :/chane1/s/chane1/chane2/ ou Substitution de toutes les occurrences de "chane1" par "chane2" pour la ligne courante :/chane1/s//chane2/g Substitution de toutes les occurrences de "chane1" par "chane2" pour la ligne courante avec demande de confirmation (y/n) :/chane1/s//chane2/gc Substitution de toutes les occurrences de "chane1" par "chane2" pour tout le fichier :g/chane1/s//chane2/g Substitution de toutes les occurrences de "chane1" par "chane2" pour tout le fichier avec demande de confirmation :g/chane1/s//chane2/gc Substitution de toutes les occurrences de "chane1" par "chane2" pour tout le fichier avec affichage des lignes traites :g/chane/s//chane2/gp Substitution de toutes les occurrences de "chane1" par "chane2" sur toutes les lignes ne contenant pas "chane3" :v/chane3/s/chane1/chane2/g
PS/LANGAGES Page 103

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Annexes

13.2 Table ASCII


D 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 H 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F Ctrl ^ ^A ^B ^C ^D ^E ^F ^G ^H ^I ^J ^K ^L ^M ^N ^O Mmen NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI D 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 H 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F Ctrl ^P ^Q ^R ^S ^T ^U ^V ^W ^X ^Y ^Z ^[ ^\ ^] ^^ ^_ Mmen DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US

D 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63

H Ch 20 SP 21 ! 22 " 23 # 24 $ 25 % 26 & 27 ' 28 ( 29 ) 2A * 2B + 2C , 2D 2E . 2F / 30 0 31 1 32 2 33 3 34 4 35 5 36 6 37 7 38 8 39 9 3A : 3B ; 3C < 3D = 3E > 3F ?

D 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95

H 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F

Ch @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _

D 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127

H Ch 60 ` 61 a 62 b 63 c 64 d 65 e 66 f 67 g 68 h 69 i 6A j 6B k 6C l 6D m 6E n 6F o 70 p 71 q 72 r 73 s 74 t 75 u 76 v 77 w 78 x 79 y 7A z 7B { 7C | 7D } 7E ~ 7F

D 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159

H Ch 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E P 9F

D 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191

H Ch A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF

D 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223

H Ch C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF

D H Ch 224 E0 225 E1 226 E2 227 E3 228 E4 229 E5 230 E6 231 E7 232 E8 233 E9 234 EA 235 EB 236 EC 237 ED 238 EE 239 EF 240 F0 241 F1 242 F2 243 F3 244 F4 245 F5 246 F6 247 F7 248 F8 249 F9 250 FA 251 FB 252 FC 253 FD 254 FE 255 FF

PS/LANGAGES

Page 104

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Table des matires 1. GENERALITES 1.1 Introduction - Historique 1.2 Notions de fonctions et de blocs 1.3 Le compilateur c 1.3.1 La compilation sous UNIX 1.3.2 La compilation sous TURBO C 2. ELEMENTS DE BASE DU LANGAGE 2.1 Les identificateurs 2.2 Les mots rservs 2.3 Les sparateurs 2.4 Les commentaires 2.5 Principales directives de compilation 2.5.1 Gnralits 2.5.2 Inclusion de fichier 2.5.3 Dfinition de pseudo-constante 2.5.4 Dfinition de macro-instructions 2.5.5 Compilations conditionnelles 2.6 Les constantes 2.6.1 Les constantes entires 2.6.2 Les constantes relles 2.6.3 Les constantes caractres 2.6.4 Les constantes chanes 2.7 Les variables 2.8 Structure d'un programme en langage C 3. LES TYPES DE BASE 3.1 Gnralits-classification 3.1.1 Les types de base 3.1.2 Les types drivs 3.1.3 Le type void 3.1.4 Les dfinitions de types par typedef 3.2 Les types entiers 3.3 Les rels 3.4 Les caractres 3.5 Initialisation des variables 3.6 Modle mmoire d'un programme C 3.7 Classes d'allocation mmoire 3.7.1 Les variables externes 3.7.2 Les variables locales 3.7.3 Les variables locales registres 3.7.4 Tableau rcapitulatif 3.7.5 Dfinition et dclaration d'une variable 3.8 Conversions de types 3.8.1 Combinaisons d'oprandes 3.8.2 Conversions lors d'assignations 3.8.3 Casting d'oprandes 4. LES OPERATEURS DE BASE 4.1 Les oprateurs arithmtiques 4.2 Les oprateurs de manipulations internes 4.3 L'oprateur d'affectation 4.4 Combinaison d'oprateurs 4.5 Incrmentation / Dcrmentation
PS/LANGAGES Page 105

1 1 2 4 5 5 7 7 7 8 8 9 9 9 9 9 10 11 11 11 11 12 12 14 15 15 15 15 15 16 16 17 17 17 18 18 19 20 20 20 21 21 21 21 22 23 23 23 23 24 24

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Table des matires 4.6 Les oprateurs relationnels 4.7 Les oprateurs logiques 4.8 Oprateur ternaire ou oprateur conditionnel 4.9 Oprateur squentiel 4.10 Oprateurs d'adressage 4.11 L'oprateur sizeof 4.12 Autres oprateurs 4.13 Priorits des oprateurs 4.14 Remarques sur les rgles de prcdence 5. LES ENTREES - SORTIES SUR LES VOIES STANDARDS 5.1 Gnralites 5.2 Les sorties mises en forme 5.3 Les entres mises en forme 5.4 Les fonctions d'entres-sorties de caractres 5.5 Squences de contrle ansi 6. LES INSTRUCTIONS EN C 6.1 L'instruction if-else 6.2 L'instruction d'aiguillage switch 6.3 La boucle while 6.4 La boucle for 6.5 La boucle do...while 6.6 Les instructions break et continue (sauts associes aux boucles) 6.7 L'instruction return 6.8 L'instruction goto 7. LES FONCTIONS 7.1 Dfinition de fonction 7.2 Appel d'une fonction 7.3 Passage de paramtres 7.4 Retour du rsultat 7.5 Prototypes des fonctions 7.6 Exemples 8. LES TABLEAUX ET LES POINTEURS 8.1 Les tableaux un indice 8.1.1 Initialisation d'un tableau un indice 8.2 Les tableaux multidimensionnels 8.2.1 Initialisation d'un tableau multidimensionnel 8.3 Les chanes de caractres 8.3.1 Fonctions de traitement sur les chanes de caractres 8.4 Tableaux et Fonctions 8.5 Les pointeurs 8.5.1 Gnralits 8.5.2 Dclaration - Utilisation 8.5.3 Pointeurs constants et pointeurs de constantes 8.5.4 Arithmtique des pointeurs 8.5.5 L'allocation dynamique dans le tas 8.5.6 Les pointeurs gnriques 8.5.7 Les pointeurs de fonction 8.5.8 Les pointeurs et les arguments de fonction 8.5.9 Les pointeurs et les oprations sur les tableaux 8.5.10 Les pointeurs et les chanes de caractres 8.5.11 Les tableaux de pointeurs
PS/LANGAGES Page 106

24 25 25 25 25 25 26 26 27 29 29 29 33 36 38 39 39 40 41 41 42 42 43 43 45 45 46 46 47 47 48 51 51 52 52 52 53 53 56 57 57 57 58 58 58 59 60 60 62 63 63

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Table des matires 8.5.12 Les paramtres du programme principal 9. LES TYPES ENUMERES ET STRUCTURES 9.1 Les numrations 9.2 Les structures 9.2.1 Gnralits - Dclaration 9.2.2 Initialisation des structures 9.2.3 Accs aux lments 9.2.4 Structures et Fonctions 9.2.5 Pointeurs sur une structure 9.2.6 Structures rcursives 9.3 Les unions 9.4 Les champs de bits 9.5 typedef 10. LES FICHIERS 10.1 Gnralits 10.2 Les fonctions de gestion de fichier 10.3 Les fonctions de niveau 1 10.3.1 open (fcntl.h) 10.3.2 eof (fcntl.h) 10.3.3 read 10.3.4 write 10.3.5 close (fcntl.h) 10.3.6 lseek (fcntl.h) 10.4 Les fonctions de niveau 2 10.4.1 fopen (stdio.h) 10.4.2 fclose (stdio.h) 10.4.3 fseek (stdio.h) 10.4.4 rewind (stdio.h) 10.4.5 ftell (stdio.h) 10.4.6 feof (stdio.h) 10.4.7 ferror (stdio.h) 10.4.8 clearerr (stdio.h) 10.4.9 perror (stdio.h) 10.4.10 getw (stdio.h) 10.4.11 putw (stdio.h) 10.4.12 fflush (stdio.h) 10.4.13 fwrite (stdio.h) 10.4.14 fread (stdio.h) 10.4.15 Autres fonctions de lecture-criture 10.4.16 Autres oprations sur les fichiers 11. AUTRES FONCTIONS DE LA BIBLIOTHEQUE STANDARD 11.1 Les tests de catgories de caractres : <ctype.h> 11.2 Les fonctions mathmatiques : <math.h> 11.3 Les fonctions utilitaires : <stdlib.h> 11.4 Les listes variables d'arguments : <stdarg.h> 11.5 Les fonctions de traitement de la date et de l'heure : <time.h> 11.6 Les limites dfinies par l'implmentation : limits.h, values.h et float.h 11.7 Le fichier errno.h 12. UTILITAIRES 12.1 Gestion de projets 12.1.1 Make
PS/LANGAGES Page 107

64 65 65 66 66 67 67 68 69 69 70 71 72 73 73 73 74 74 74 75 75 75 75 76 76 76 77 77 77 77 78 78 78 78 78 78 79 79 79 79 81 81 82 83 84 85 86 88 89 89 89

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Table des matires 12.1.2 Gestion de projets sous TURBO C 12.2 L'utilitaire LINT 12.3 Dbogage des programmes sous UNIX 12.3.1 Utilisation de DBX 12.3.2 Lancement et sortie 12.3.3 Pose de points d'arrts 12.3.4 Principales commandes d'dition 12.3.5 Edition du source en cours de debug 12.3.6 Examen des variables du programme 12.3.7 Commandes diverses 12.4 Dbogage des programmes sous TURBO C 12.4.1 Principales commandes 12.4.2 Actions sur les variables 12.4.3 Points d'arrts 12.5 Gestionnaires de bibliothques 12.5.1 L'utilitaire ar (UNIX) 12.5.2 L'utilitaire TLIB (TURBO C) 13. ANNEXES 13.1 UTILISATION DE VI 13.1.1 Prsentation de VI 13.1.2 Spcification du type de terminal 13.1.3 Configuration de VI 13.1.4 Entre dans VI 13.1.5 Sortie de VI 13.1.6 Cration et insertion de texte 13.1.7 Dplacement du curseur dans un fichier 13.1.8 Dplacement du curseur dans la fentre 13.1.9 Recherche de chanes de caractres 13.1.10 Destruction de texte 13.1.11 Remplacement de texte 13.1.12 Annulation ou rptition d'une commande 13.1.13 Copie et dplacement de texte 13.1.14 Insrer le contenu d'un autre fichier 13.1.15 Insrer le rsultat d'une commande dans un fichier 13.1.16 Copie d'une partie d'un fichier dans un autre fichier 13.1.17 Les buffers nomms (de la forme "lettre) 13.1.18 Regroupement de lignes 13.1.19 Echange de buffers nomms entre fichiers 13.1.20 Rcupration des objets dtruits 13.1.21 Recherche et remplacement de chanes de caractres 13.2 Table ASCII 91 91 92 92 92 93 93 93 93 93 94 94 94 94 94 95 95 97 97 97 97 97 97 98 98 99 100 100 100 101 101 102 102 102 102 102 103 103 103 103 104

PS/LANGAGES

Page 108

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Index

#define ,9 #endif,10 #ifdef,10 #ifndef,10 #include,9 #undef,10 abort,83 abs,84 acos,82 ar,95 argc,64 argv,64 asctime,85 asin,82 atan,82 atan2,82 atexit,83 atof,83 atoi,83 atol,83 auto,20 break,40, 42 bsearch,84 calloc,59 case,40 Casting,22 cc,5 ceil,82 char,15 clearerr,78 clock,85 clock_t,85 close,75 commentaires,8 continue ,42 cos,82 cosh,82 ctime ,85 DBX,92 default ,40 difftime ,85 div,84 do...while,42 double,15 enum,65 eof,74 errno.h,88 exit,83 exp,82 extern,21 fabs,82 feof,77 ferror,78 fflush,78 fflush(stdin) ,36 fgetc ,36 fgets,36 float ,15 float.h,87 floor,82 fmod,82 fopen,76 for,41 fprintf ,29

fputc,36 fputs,37 fread,79 free,59 freopen,79 frexp,82 fscanf ,33 fseek,77 ftell,77 fwrite,79 getc,37 getchar,37 getenv,83 gets,37 getw,78 gmtime,85 goto,43 heap,58 identificateur,7 if-else,39 include,9 int ,15 isalnum,81 isalpha,81 isascii,81 iscntrl,81 isdigit,81 isgraph,81 islower,81 isprint,81 ispunct,81 isspace,81 isupper,81 isxdigit,81 labs,84 ldexp,82 ldiv,84 left-value ,21 limits.h ,86 LINT,91 localtime ,85 log,82 log10,82 long,15 lseek,75 lvalue,13, 23 main,2 Make,5, 89 makefile,89 malloc,59 memchr,55 memcmp,55 memcpy,55 memmove,55 memset,55 mktime ,85 modf,82 mots rservs,7 open,74 perror,78 pow,82 printf ,29 putc,37 putchar,37

PS/LANGAGES

Page 109

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Index
puts,37 putw,78 qsort,84 rand,83 read,75 realloc,59 register,20 remove,79 rename,79 return,40, 43, 47 rewind,77 rvalue,13 scanf ,33 sparateurs,8 setbuf ,80 setvbuf ,80 short,15 sin,82 sinh,82 sizeof,25 sprintf ,29 sqrt,82 srand,83 sscanf ,33 static ,19 stdaux,29 stderreur,29 stdin,29 stdio.h ,29 stdout,29 stdprn,29 strcat,54 strchr,54 strcmp,54 strcpy,53 strcspn,55 strerror,55 strftime ,86 strlen,55 strncat,54 strncmp,54 strncpy,53 strpbrk,55 strrchr,54 strspn,54 strstr,55 strtod,83 strtok,55 strtol,83 strtoul,83 struct,66 switch,40 system,83 tan,82 tanh,82 tas ,58 time,85 time_t,85 TLIB,95 tmpfile,79 tmpnam,80 toascii,81 tolower,81 toupper,81 transtypage,22 typedef,16, 72 ungetc,37 union,70 va_arg,84 va_end,84 va_start,84 values.h,87 VI,97 void,15 while,41 write,75

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

S-ar putea să vă placă și