Sunteți pe pagina 1din 63

Langage C

2008-2009

Bibliographie
Le langage C, B. W. Kernighan et D. M. Ritchie, L'essentiel des structures de donnes en C, Horwitz, Sahni et nderson!"reed Le cours de Anne Canteaut, http ://www-rocq.inria.fr/codes/Anne.Canteaut/COURS_C/

Table des matires


Cha$itre # % &otions De Base 'n Langage C....................................................................................... ( #. )nralits................................................................................................................................... ( *.Les +a,leau-.................................................................................................................................. (. Les /$rateurs........................................................................................................................... #0 1. Les 'ntrees!sorties Con2ersationnelles..................................................................................... #3 4. Les 5nstructions De Contr6le..................................................................................................... *0 Cha$itre * % Structures 7 8nions 7 'nu9ration................................................................................*1 #. D:inition De +;$es Co9$oss a2ec t;$ede:............................................................................*1 *. Les Structures............................................................................................................................ *1 (. Les Cha9$s De Bits.................................................................................................................. *4 1. Les 8nions................................................................................................................................. *3 4. Les nu9rations....................................................................................................................... *. Cha$itre ( % Les <ointeurs.................................................................................................................. *= #. dresse et 2aleur d'un o,>et....................................................................................................... *= *. &otion de $ointeur..................................................................................................................... *= (. rith9ti?ue des $ointeurs........................................................................................................ (0 1. <ointeurs et constantes ..............................................................................................................(# 4. <ointeurs et structures................................................................................................................ (* Cha$itre 1 % Les Cha@nes De CaractAres............................................................................................. (1 #. D:inition 't Dclaration Des Cha@nes De CaractAres 'n C..................................................... (1 *. Saisie d'une cha@ne de caractAres :gets..................................................................................... (4 (. Reco$ie d'une cha@ne de caractAres strc$;, strnc$;................................................................... (4 1. Concatnation de cha@nes strcat, strncat.................................................................................... (4 4. Co9$araison de cha@nes strc9$, strnc9$.................................................................................(3 3. Longueur d'une cha@ne strlen.................................................................................................... (3 .. Recherche d'une cha@ne dans une autre strstr.............................................................................(. =. +est de caractAres isa$lha,isalnu9, islower, isu$$er................................................................. (. B. Recherche de caractAres dans une cha@ne strchr,str,rC..............................................................(. #0. '-traction de cha@ne strtoC..................................................................................................... (= ##. Du$lication de cha@ne strdu$................................................................................................... (= Cha$itre 4 % Les "onctions..................................................................................................................10 #. D:inition d'une "onction.......................................................................................................... 10 *. '-e9$le d'utilisation de :onctions.............................................................................................1# *.( "onction a;ant * $ara9Atres d'entre et * $ara9Atres de sortie.............................................. 1* (. Dure de 2ie des 2aria,les......................................................................................................... 13 1. Les $ara9Atres de la :onction 9ain........................................................................................... 1= 4. <ointeur sur une :onction........................................................................................................... 1B 3. "onctions a2ec un no9,re 2aria,le de $ara9Atres.................................................................... 4# Cha$itre 3 % Les "ichiers.....................................................................................................................41 #. La :onction :o$en......................................................................................................................41 *. La :onction :close..................................................................................................................... 44 (. La :onction :read .......................................................................................................................44 1. La :onction :write...................................................................................................................... 44 Cha$itre . % llocation D;na9i?ue....................................................................................................4B #. llocation si9$le 9alloc........................................................................................................... 4B *. llocation 9ulti$le realloc........................................................................................................ 4B Cha$itre = % Listes Cha@nes............................................................................................................... 3(

Chapitre 1 : Notions De Base n Langage C

1!

"#n#ralit#s

Le langage C conDu en #B.* $ar D. Richie et K. +ho9$son $our d2elo$$er le s;stA9e dEe-$loitation % 8&5F. 8n $rogra99e C est dcrit $ar un :ichier texte, a$$el fichier source. Le $rogra99e est ensuite traduit en langage 9achine grGce H un compilateur. La co9$ilation se dco9$ose en trois $hases successi2es % # Le traite$ent par pr#processeur : trans:or9ations $ure9ent te-tuelles Ire9$lace9ent de cha@nesJ * La co$pilation : traduction en instructions co9$rhensi,les $ar le 9icro$rocesseur Iasse9,leurJ ( Asse$blage et liaison : asse9,lage des di::rents :ichiers sources crits et $roduction dEun :ichier dit excutable Le co9$ilateur le $lus utilis est le co9$ilateur gcc, dis$oni,le gratuite9ent $our Linu- et Windows nota99ent

1!1! %n &ichier source


8n $rogra99e C s'organise de la 9aniAre sui2ante% [directives au prprocesseur [dc!aration de varia"!es #!o"a!es [fonctions secondaires int $ain%void& ' dc!aration de varia"!es !oca!es instructions ( 'our si$pli&ier, la d#claration des (ariables locales H une :onction se :ait a$rAs le d,ut du 9odule, c'est H dire a$rAs l'accolade ou2erte, celle des (ariables globales s'e::ectue H l'e-trieur du cor$s de la :onction. &ous re2iendrons $lus en dtail sur ces distinctions et sur la :aDon de les traduire en C. %ne instruction se ter9ine $ar un )*), les co$$entaires sont encadrs $ar )/*) et $ar )*/). Le co$pilateur dissocie les $inuscules des $a+uscules! Les (* 9ots cle:s reconnus $ar le co9$ilateur sont % auto unsi#ned switch si,eof return const "rea+ void t-pedef static dou"!e continue case vo!ati!e union f!oat e!se defau!t char whi!e int for enu$ do short !on# #oto e.tern struct si#ned re#ister if

1!2!

D#clarations

Les dclarations des o,>ets 9ani$uls $ar le $rogra99e $er9ettent au co9$ilateur de rser2er un e9$lace9ent 99oire $our ces o,>ets en leur a::ectant une adresse et une taille. 5l ; a deu- genres d'o,>ets% les o,>ets constants et les 2aria,les. Le t;$e des o,>ets $eut Ktre $rd:ini ou ,ien cr H l'aide du 9ot!cle: t-pedef. La dclaration se :ait de la :aDon sui2ante % t-pe /o$0ar12

oL /o$0ar1 est une 2aria,le ?ui sera $lace dans la zone de donnes. Les t,pes pr#d#&inis : char int f!oat dou"!e short !on#

unsi#ned

Le t,pe char : La $lu$art du te9$s une 2aria,le de t;$e char est code sur # octet I= ,itsJ. 8n caractAre $eut contenir n'i9$orte ?uel l9ent du >eu de caractAres de la 9achine utilise. <our les langues d''uro$e occidentale elle re$ose sur le codage SC55 Icodage sur . ,its des di::rents caractAresJ. De $lus en $lus le codage 8&5C/D' se r$end, il re$ose sur un codage #3 ,its et $er9et le codage des al$ha,ets non Latin. dc. (* O P # $ % & ' I J Q S , ! . T 0 # * ( 1 4 3 . = B % Y < [ > (( (1 (4 (3 (. (= (B 10 1# 1* 1( 11 14 13 1. 1= 1B 40 4# 4* 4( 41 44 43 4. 4= 4B 30 3# 3* he-. *0 *# ** *( *1 *4 *3 *. *= *B *a *, *c *d *e *: (0 (# (* (( (1 (4 (3 (. (= (B (a (, (c (d (e B C D ' " ) H 5 R K L M & / < U R S + 8 V W F W X Z \ \ ^ M dc. 31 34 33 3. 3= 3B .0 .# .* .( .1 .4 .3 .. .= .B =0 =# =* =( =1 =4 =3 =. == =B B0 B# B* B( B1 he-. 10 1# 1* 1( 11 14 13 1. 1= 1B 1a 1, 1c 1d 1e 1: 40 4# 4* 4( 41 44 43 4. 4= 4B 4a 4, 4c 4d 4e N a , c d e : g h i > C l 9 n o $ ? r s t u 2 w ; z { | } ~ dc. B3 B. B= BB #00 #0# #0* #0( #01 #04 #03 #0. #0= #0B ##0 ### ##* ##( ##1 ##4 ##3 ##. ##= ##B #*0 #*# #** #*( #*1 #*4 #*3 he-. 30 3# 3* 3( 31 34 33 3. 3= 3B 3a 3, 3c 3d 3e 3: .0 .# .* .( .1 .4 .3 .. .= .B .a ., .c .d .e

_ DEL #*. ] 3( (: B4 4: .: +a,le # % Codes SC55 des caractAres i9$ri9a,les

main() { char c = 'A'; prin !("%c"# c ); prin !("%$"#c); prin !("%%"#c); c=c&'; prin !("%c"# c ); prin !("%$"#c); prin !("%%"#c); }

// A s3affiche 4 !3cran // 56 s3affiche 4 !3cran // 71 s3affiche 4 !3cran // 8 s3affiche 4 !3cran // 55 s3affiche 4 !3cran // 79 s3affiche 4 !3cran

Sui2ant les i9$l9entations, le t;$e char est sign ou non. 'n cas de doute, il 2aut 9ieu- $rciser unsi#ned char ou si#ned char! &otons ?ue tous les caractAres i9$ri9a,les sont $ositi:s.

Les t;$es entiers

Le 9ot!cle: dsignant le t;$e entier est int. 8n o,>et de t;$e int est re$rsent $ar un 9ot ''naturel'' de la 9achine utilise, (* ,its $our un D'C al$ha ou un <C 5ntel. 8n char $eut gale9ent Ktre 2u co99e un entier cod sur = ,its.
Le t;$e int $eut Ktre $rcd d'un attri,ut de $rcision Ishort ou !on#J etTou d'un attri,ut de re$rsentation Iunsi#nedJ.8n o,>et de t;$e short int a au 9oins la taille d'un char et au $lus la taille d'un int. 'n gnral, un short int est cod sur #3 ,its. 8n o,>et de t;$e !on# int a au 9oins la taille d'un int I31 ,its sur un D'C al$ha, (* ,its sur un <C 5ntelJ.

D'C l$ha char short int !on# = ,its #3 ,its (* ,its 31 ,its

<C 5ntel ILinu-J = ,its #3 ,its (* ,its (* ,its caractAre entier court entier entier long

+a,le * % Les t;$es entiers Le ,it de $oids :ort d'un entier est son signe. 8n entier $ositi: est donc re$rsent en 99oire $ar la suite de (* ,its dont le ,it de $oids :ort 2aut 0 et les (# autres ,its corres$ondent H la dco9$osition de l'entier en ,ase *. <ar e-e9$le, $our des o,>ets de t;$e char I= ,itsJ, l'entier $ositi: #* sera re$rsent en 99oire $ar 0000##00. 8n entier ngati: est, lui, re$rsent $ar une suite de (* ,its dont le ,it de $oids :ort 2aut # et les (# autres ,its corres$ondent H la 2aleur a,solue de l'entier re$rsente sui2ant la techni?ue dite du NNco9$l9ent H *''. Cela signi:ie ?ue l'on e-$ri9e la 2aleur a,solue de l'entier sous :or9e ,inaire, ?ue l'on $rend le co9$l9entaire ,it!H!,it de cette 2aleur et ?ue l'on a>oute # au rsultat. insi, $our des o,>ets de t;$e si#ned char I= ,itsJ, !# sera re$rsent $ar ########, !* $ar #######0, !#* $ar $ar ####0#00. 8n int $eut donc re$rsenter un entier entre !*(# et I*(#!#J. L'attri,ut unsi#ned s$ci:ie ?ue l'entier n'a $as de signe. 8n unsi#ned int $eut donc re$rsenter un entier entre 0 et I* (*!#J. Sur un D'C al$ha, on utilisera donc un des t;$es sui2ants en :onction de la taille des donnes H stocCer % si#ned char unsi#ned char short int Z!*.Y*.Z Z0Y*=Z Z!*#4Y *#4Z

unsi#ned short int int unsi#ned int

Z0Y*#3Z Z!*(#Y*(#Z Z0Y*(*Z Z!*3(Y*3(Z

!on# int ID'C al$haJ <lus gnrale9ent, les 2aleurs 9a-i9ales et 9ini9ales des di::rents t;$es entiers sont d:inies dans la li,rairie standard !i$its.h. Le 9ot!cle: si,eof a $our s;nta-e si,eof%expression& oL expression est un t;$e ou un o,>et. Le rsultat est un entier gal au no9,re d'octets ncessaires $our stocCer le t;$e ou l'o,>et. <ar e-e9$le unsi#ned short .2 tai!!e : si,eof%unsi#ned short&2 tai!!e : si,eof%.&2

Dans les deu- cas, tai!!e 2audra 1. <our o,tenir des $rogra99es $orta,les, on s'e::orcera de ne >a9ais $rsu9er de la taille d'un o,>et de t;$e entier. /n utilisera tou>ours une des constantes de !i$its.h ou le rsultat o,tenu en a$$li?uant l'o$rateur si,eof.

Les t;$es :lottants

Les t;$es f!oat, dou"!e et !on# dou"!e ser2ent H re$rsenter des no9,res en 2irgule :lottante. 5ls corres$ondent au- di::rentes $rcisions $ossi,les.

D'C l$ha <C 5ntel f!oat dou"!e !on# dou"!e (* ,its 31 ,its 31 ,its (* ,its :lottant 31 ,its :lottant dou,le $rcision #*= ,its :lottant ?uadru$le $rcision

+a,le (% Les t;$es :lottants Les :lottants sont gnrale9ent stocCs en 99oire sous la re$rsentation de la 2irgule :lottante nor9alise. ! le t;$e f!oat est cod sur 1 octets et re$rsente les no9,res H 2aleur a,solue dans lEinter2alle (.1 '!(= H (.1 'S(=, ! le t;$e dou"!e est cod sur = octets et re$rsente les no9,res H 2aleur a,solue dans lEinter2alle #.. '!(0= H #.. 'S(0=, ! le t;$e !on# dou"!e est cod sur #0 octets et re$rsente les no9,res H 2aleur a,solue dans lEinter2alle (.1 '!1B(* H #.# 'S1B(*,

;a dc!aration des constantes : Celle!ci $eut se :aire de deu- :aDons % #! <define /o$Const va!eurcte Ie-e9$le % <define a 6J

la directi2e de co9$ilation <define s'adresse au prprocesseur ?ui inter2ient >uste a2ant le co9$ilateur $ro$re9ent dit. Le tra2ail du $r$rocesseur consiste H traduire les lignes de $rogra99ation co99enDant $ar le caractAre < de :aDon H $r$arer le tra2ail du co9$ilateur. Dans le cas de <define, le $r$rocesseur re9$lace dans

le :ichier source toutes les occurrences de /o$Const $ar sa 2aleur % va!eurcte. La constante de nom /o$Const n'a donc aucune existence physique. 5l e-iste d'autres directi2es de co9$ilation dont certaines seront tudies ultrieure9ent. Dans l'e-e9$le toutes les occurrences de a seront re9$laces $ar (. const t-pe /o$Const : va!eurcte2 Ie-% const int " : =2J le co9$ilateur cre la 2aria,le constante /o$Const en 99oire et lui a::ecte la 2aleur va!eurcte. /n $ourra ainsi accder H l'adresse de /o$Const 9ais on ne pourra en aucun cas modifier sa valeur. /n $rcisera, le t;$e de la constante. Dans l'e-e9$le ) est un entier ?ui 2aut *, il est accessi,le en lecture 9ais $as en criture.

*!

Remarques :

-l n.e/iste pas de t,pe bool#en en Langage C. Lors de l'utilisation de ,oolen Itests logi?ues...J, il :audra se sou2enir des con2entions sui2antes % ! un ,oolen est un entier, ! la 2aleur " 8F est un entier gal H zro, ! la 2aleur VR 5 est un entier gal H # dans le cas du rsultat d'une 2aluation, di::rent de zro ?uand on cherche H 2aluer. '-e9$le % I( ^ 1J a $our 2aleur 0 I" 8FJ , I( _ 1J a $our 2aleur # IVR 5J, et ( est VR 5. /e$ple d.-nitialisation lors de la d#claration int i:9> ?:-62 // i ppv 9 et ? ppv @6 char c:AAA 2 // c ppv BAA cAest 4 dire 56 %code ASCCC& char d:56 2 // d ppv 56 cAest 4 dire !a !ettre A char e:AD.71A2 // e ppv 71 en Ee.a> i.e. 56 en dci$a!e soit !a !ettre A

2! Les 0ableau/ 2!1! Les tableau/ 1 une di$ension


La dclaration d'un ta,leau est la sui2ante t-pe /o$Fa" [ FAC;GAH 2

t-pe est le t;$e des l9ents co9$osant le 2ecteur, /o$Fa" est le no9 ?ui dsigne le ta,leau, FAC;GAH est la taille de dclaration c'est!H!dire le no9,re d'l9ents 9a-i9u9 utilisa,les. Lors de la d#claration, le co$pilateur r#ser(e la $#$oire n#cessaire pour le tableau c'est!H!dire ?u'il rser2e FAC;GAH*si,eof%t-pe& octets. FAC;GAH doit obligatoire$ent 2tre une e/pression constante de t,pe entier c.est-1-dire e/plicite ou d#&inie gr3ce 1 une directi(e de co$pilation <define. 'ar d#&inition, en langage C, /o$Fa" est l.adresse du pre$ier #l#$ent du tableau, cette adresse est constante puis4ue c.est le co$pilateur 4ui lui a a&&ect# une (aleur lors de la d#claration du tableau . La 2aleur de cette adresse ne $ourra en aucun cas Ktre 9odi:ie $ar le $rogra99e. /o$Fa"[i dsigne l'l9ent d'indice i du ta,leau IA00 N0-5N les indices co$$encent 1 0, par cons#4uent i pourra (arier de I 1 FAC;GAH-1J. 5l dsigne le contenu du ta,leau H la $osition iJ1 Y il s'agit donc d'une (aleur. K/o$Fa"[i caractrise l'adresse de l'l9ent /o$Fa"[i . &ous re2iendrons $lus en dtail sur les notions d'adresses ultrieure9ent.

Adresses K/o$Fa"[FAC;GAH-1 K/o$Fa"[FAC;GAH-9 ... K/o$Fa"[9 K/o$Fa"[1 /o$Fa" : K/o$Fa"[I

0a!eurs /o$Fa"[FAC;GAH-1 /o$Fa"[FAC;GAH-9 /o$Fa"[9 /o$Fa"[1 /o$Fa"[I

L'initialisation d'un ta,leau $eut se :aire en 9K9e te9$s ?ue sa dclaration. Exemple : f!oat vect [ 7 : ' -6.L > 7.MM > 9.5= > -76.5=6 (2 $lace !4.( dans 2ect Z 0 \, 1.== dans 2ect Z # \, *.3. dans 2ect Z * \ et !14.3.4 dans 2ect Z ( \ Y f!oat vect [ : ' -6.L > 7.MM > 9.5= > -76.5=6 (2 $lace !4.( dans 2ect Z 0 \, 1.== dans 2ect Z # \, *.3. dans 2ect Z * \ et !14.3.4 dans 2ect Z ( \ et :i-e sa di9ension H 1.

2!2!

Les tableau/ 1 plusieurs di$ensions

La dclaration d'un ta,leau H deu- di9ension est t-pe /o$Fa" [ ;CNGAH [ CO;GAH 2 t-pe est le t;$e des l9ents co9$osant le ta,leau, /o$Fa" est le no9 ?ui dsigne le ta,leau, ;CNGAH est la taille de dclaration de la longueur 9a-i9ale des lignes, CO;GAH est la taille de dclaration de la longueur 9a-i9ale des colonnes. Lors de la dclaration, le co9$ilateur rser2e la 99oire ncessaire $our le ta,leau c'est!H!dire ?u'il rser2e ;CNGAH*CO;GAH*si,eof%t-pe& octets. ;CNGAH et CO;GAH doi2ent o,ligatoire9ent Ktre des e-$ressions constantes de t;$e entier c'est!H!dire e-$licites ou d:inies grGce H une directi2e de co9$ilation <define+ <ar d:inition, en langage C, /o$Fa" est l'adresse du ta,leau, cette adresse est constante $uis?ue c'est le co9$ilateur ?ui lui a a::ect une 2aleur lors de la dclaration du ta,leau. La 2aleur de cette adresse ne $ourra en aucun cas Ktre 9odi:ie $ar le $rogra99e. /o$Fa"[i [? dsigne l'l9ent de la ligne i et de la colonne > I ++'&+5/& les indices co99encent H 0, $ar cons?uent i $ourra 2arier de I 1 ;CNGAH-1 et ? $ourra 2arier de I 1 CO;GAH-1J. 5l s'agit donc d'une (aleur. K/o$Fa"[i [? dsigne l'adresse de l'l9ent /o$Fa"[i [? . Les l9ents sont rangs en 99oire con:or99ent H la :igure ci dessous.

Adresse !$nts K/o$Fa"[;CNGAH-1 [CO;GAH-1 K/o$Fa"[;CNGAH-1 [I /o$Fa"[;CNGAH-1 K/o$Fa"[;CNGAH-1 [I K/o$Fa"[1 [CO;GAH-1

0a!eurs /o$Fa"[;CNGAH-1 [CO;GAH-1 ... /o$Fa"[;CNGAH-1 [I /o$Fa"[;CNGAH-1 [I ... /o$Fa"[1 [CO;GAH-1

... K/o$Fa"[1 [1 /o$Fa"[1 K/o$Fa"[1 [I K/o$Fa"[I [CO;GAH-1 K/o$Fa"[I [1 /o$Fa" /o$Fa"[I K/o$Fa"[I [I /o$Fa"[1 [1 /o$Fa"[1 [I /o$Fa"[I [CO;GAH-1 ... /o$Fa"[I [1 /o$Fa"[I [I

/e$ple de d#claration et d.initialisation d.un tableau : int Fa"[9 [9 2 f!oat Gat[9 [7 : ''-6.L>7.MM>9.5=>-76.5=6( >'L.=9>-9.5>L6.1>I.96( (2 Les di9ensions su$rieures res$ectent le 9K9e $rinci$e. int Fa"[9 [9 [= [7 2 // dc!aration d3un ta"!eau de di$ension 7

6! Les 5p#rateurs 6!1! 5p#ration d.a&&ectation


'n C, l'a::ectation est un o$rateur H $art entiAre. 'lle est s;9,olise $ar le signe =. Sa s;nta-e est la sui2ante % varia"!e : e.pression Le ter9e de gauche de l'a::ectation $eut Ktre une 2aria,le si9$le un l9ent de ta,leau 9ais $as une constante. Cette e-$ression a $our e::et d'2aluer expression et d'a::ecter la 2aleur o,tenue H variable. De $lus, cette e-$ression $ossAde une 2aleur, ?ui est celle de l',%pr,--i.n. insi, l'e-$ression i = ( 2aut 4. L'a::ectation e::ectue une conversion de type implicite % la 2aleur de l'e-$ression Iter9e de droiteJ est con2ertie dans le t;$e du ter9e de gauche. <ar e-e9$le, le $rogra99e sui2ant

$ain%& ' int i> ? : 92 f!oat . : 9.62 i : ? J .2 . : . J i2 printf%)Dn Of Dn)>.&2 (

i9$ri9e $our % la 2aleur 3.4 Iet non .J, car dans l'instruction i : ? J .2, l'e-$ression ? J . a t con2ertie en entier. 6!2 Les op#rateurs arith$#ti4ues Les o$rateurs arith9ti?ues classi?ues sont l'o$rateur unaire / Ichange9ent de signeJ ainsi ?ue les o$rateurs ,inaires
J * / O addition soustraction 9ulti$lication di2ision reste de la di2ision I9oduloJ

Ces o$rateurs agissent de la :aDon attendue sur les entiers co99e sur les :lottants. Leurs seules s$ci:icits sont les sui2antes %

Contraire9ent H d'autres langages, le C ne dis$ose ?ue de la notation / $our dsigner H la :ois la di2ision entiAre et la di2ision entre :lottants. Si les deu- o$randes sont de t;$e entier, l'o$rateur / $roduira une di2ision entiAre I?uotient de la di2isionJ. <ar contre, il dli2rera une 2aleur :lottante dAs ?ue l'un des o$randes est un :lottant. <ar e-e9$le, f!oat .2 . : L / 92 a::ecte H . la 2aleur #. <ar contre . : 7.7 / 92

#0

a::ecte H . la 2aleur 9.9.

L'o$rateur O ne s'a$$li?ue ?u'H des o$randes de t;$e entier. Si l'un des deu- o$randes est ngati:, le signe du reste d$end de l'i9$l9entation, 9ais il est en gnral le 9K9e ?ue celui du di2idende.
y

&otons en:in ?u'il n'; a $as en C d'o$rateur e::ectuant l'l2ation H la $uissance. De :aDon gnrale, il :aut utiliser la :onction pow%.>-& de la li,rairie $ath.h $our calculer x

6!6! Les op#rateurs relationnels


P P: Q Q: :: R: Leur s;nta-e est expression-1 op expression-2 stricte9ent su$rieur su$rieur ou gal stricte9ent in:rieur in:rieur ou gal gal di::rent

Les deu- e-$ressions sont 2alues $uis co9$ares. La 2aleur rendue est de t;$e int Iil n'; a $as de t;$e ,oolen en CJY elle 2aut # si la condition est 2raie, et 0 sinon. ttention H ne $as con:ondre l'o$rateur de test d'galit == a2ec l'o$rateur d'a::ection =. insi, le $rogra99e ci dessous i9$ri9e H l'cran a et " sont e#au. O
$ain%& ' int a : I2 int " : 12 if %a : "& // ;3SRRSUR SSF CCC printf%)Dn a et " sont e#au. Dn)&2 e!se printf%)Dn a et " sont differents Dn)&2 (

6!7 Les op#rateurs logi4ues bool#ens


KK '+ logi?ue TT /8 logi?ue R ngation logi?ue Co99e $our les o$rateurs de co9$araison, la 2aleur retourne $ar ces o$rateurs est un int ?ui 2aut # si la condition est 2raie et 0 sinon. Dans une e-$ression de t;$e e.pression-1 op-1 e.pression-9 op-9 ...e.pression-n

l'2aluation se :ait de gauche H droite et s'arrKte dAs ?ue le rsultat :inal est dter9in. <ar e-e9$le dans

##

int i:192 int p:L2 if %%i P: I& KK %i Q: U& KK R%p:: I&&

la derniAre clause ne sera $as 2alue car i n'est $as entre 0 et B.

6!8 Les op#rateurs logi4ues bit 1 bit Les si- o$rateurs sui2ants $er9ettent de 9ani$uler des entiers au ni2eau du ,it. 5ls s'a$$li?uent au- entiers de toute longueur Ishort> int ou !on#J, signs ou non.
K V '+ /8 e-clusi: QQ dcalage H gauche T W /8 inclusi: co9$l9ent H #

PP dcalage H droite

'n $rati?ue, les o$rateurs K# T et V consistent H a$$li?uer ,it H ,it les o$rations sui2antes %

& 0 0 0 ' 0 | 0 0 0 ' ' ^ 0 0 0 ' '

' 0 ' ' ' ' ' ' 0

L'o$rateur unaire ~ change la 2aleur de cha?ue ,it d'un entier. Le dcalage H droite et H gauche e::ectuent res$ecti2e9ent une 9ulti$lication et une di2ision $ar une $uissance de *. &otons ?ue ces dcalages ne sont $as des dcalages circulaires Ice ?ui d$asse dis$ara@tJ. Considrons $ar e-e9$le les entiers a:== et ":9L de t;$e unsi#ned char Ii.e. = ,itsJ. 'n ,ase * il s'cri2ent res$ecti2e9ent 0#00##0# et 000#0###.

2aleur e-$ression ,inaire a I1II11I1 " a K " a T " a V " III1I111 IIIII1I1 I1I11111 I1I11I1I dci9ale == 9L 6 U6 UI

#*

Wa " QQ 9 " QQ 6 " PP 1

1I11II1I I1I111II 111IIIII IIII1I11

1=M U9 119 11 9ulti$lication $ar 1 ce ?ui d$asse dis$ara@t di2ision entiAre $ar *

6!9 Les op#rateurs d.a&&ectation co$pos#e


Les o$rateurs d'a::ectation co9$ose sont

J:

-:

*:

/:

O:

K:

V:

T:

QQ:

PP:

<our tout o$rateur op, l'e-$ression est ?ui2alente H

e.pression-1 op: e.pression-9

e.pression-1 : e/pression-1 op e/pression-2 +oute:ois, a2ec l'a::ection co9$ose, e.pression-1 n'est 2alue ?u'une seule :ois.

6!: Les op#rateurs d.incr#$entation et de d#cr#$entation


Les o$rateurs d'incr9entation JJ et de dcr9entation -- s'utilisent aussi ,ien en su::i-e IiJJJ ?u'en $r:i-e IJJiJ. Dans les deu- cas la 2aria,le i sera incr9ente, toute:ois dans la notation su::i-e la 2aleur retourne sera l'ancienne 2aleur de i alors ?ue dans la notation $r:i-e se sera la nou2elle. <ar e-e9$le, int a : L> "> c2 " : JJa2 /* a et " va!ent 7 */ c : "JJ2 /* c vaut 7 et " vaut 6 */

6!8 L.op#rateur (irgule


8ne e-$ression $eut Ktre constitue d'une suite d'e-$ressions s$ares $ar des 2irgules % e.pression-1> e.pression-9> ... > e.pression-n Cette e-$ression est alors 2alue de gauche H droite. Sa 2aleur sera la 2aleur de l'e-$ression de droite. <ar e-e9$le, le $rogra99e $ain%& ' int a> "2 " : %%a : L&> %a J 9&&2 printf%)Dn " : Od Dn)>"&2 ( i9$ri9e ) = (.

#(

6!9 L.op#rateur conditionnel ternaire


L'o$rateur conditionnel X est un o$rateur ternaire. Sa s;nta-e est la sui2ante % condition X expression-1 : expression-2 Cette e-$ression est gale H e.pression-1 si condition est satis:aite, et H e.pression-9 sinon. <ar e-e9$le, l'e-$ression / ;< 0 = / : -/ corres$ond H la 2aleur a,solue d'un no9,re. De 9K9e l'instruction $ : %%a P "& X a : "&2 a::ecte H m le 9a-i9u9 de a et de ).

6!10 L.op#rateur de con(ersion de t,pe


L'o$rateur de con2ersion de t;$e, a$$el cast, $er9et de 9odi:ier e-$licite9ent le t;$e d'un o,>et. /n crit %type& objet <ar e-e9$le, $ain%& ' int i : L> ? : 92 printf%)Of Dn)>%f!oat&i/?&2 ( retourne la 2aleur #.4.

6!11 L.op#rateur adresse


L'o$rateur d'adresse & a$$li?u H une 2aria,le retourne l'adresse!99oire de cette 2aria,le. La s;nta-e est Kobjet

6!12 >?gles de priorit# des op#rateurs


Le ta,leau sui2ant classe les o$rateurs $ar ordres de $riorit dcroissants. Les o$rateurs $lacs sur une 9K9e ligne ont 9K9e $riorit. Si dans une e-$ression :igurent $lusieurs o$rateurs de 9K9e $riorit, l'ordre d'2aluation est d:inie $ar la :lAche de la seconde colonne du ta,leau. /n $r:rera toute:ois 9ettre des $arenthAses en cas de doute...

o$rateurs () 12 3 4 & << < == ~ 6 >> <= 3= > && %

/> //

+ /IunaireJ (type) 4(in$ir,c i.n) &IadresseJ -i5,.!

/I,inaireJ >=

#1

&Iet ,it!H!,itJ ^ | && || 7 8 = # +a,le #.1% RAgles de $riorit des o$rateurs &= /= 4= 6= %= &= ^= |= <<= >>=

<ar e-e9$le, les o$rateurs logi?ues ,it!H!,it sont 9oins $rioritaires ?ue les o$rateurs relationnels. Cela i9$li?ue ?ue dans des tests sur les ,its, il :aut $arenthser les e-$ressions. <ar e-e9$le, il :aut crire if %%. V -& R: I&

#4

7!

Les ntrees-sorties Con(ersationnelles


5l s'agit des :onctions de la li,rairie standard stdio.h utilises a2ec les units classi?ues d'entres!sorties, ?ui sont res$ecti2e9ent le cla2ier et l'cran.

7!1!

Les sorties ou #critures a l.#cran


La &onction printf : <rotot;$e % int printf % const char *for$at> ... &

La 2aleur retourne $ar printf est le no9,re de caractAres crits ou une 2aleur ngati2e en cas d'erreur. Cette 2aleur est rare9ent utilise. Les $ara9Atres de la :onction sont constitus des :or9ats et des 2aria,les ?ui doi2ent Ktre a::iches. Le code format et le type des arguments doivent tre en correspondance Exemple : soit n une 2aria,le entiAre contenant la 2aleur #* et $o- une 2aria,le relle de 2aleur #(,3., crire 'la 9o;enne des ', n,' notes de l'tudiant est gale H ', $ose traduit $ar

int n:192 f!oat $o-:1L.5=2 printf % )!a $o-enne des Od notes de !3tudiant est #a!e 4 Of Dn)> n> $o-&2 /n 2erra alors sur l'cran % !a $o-enne des 19 notes de !3tudiant est #a!e 4 1L.5= :or9at con2ersion en Od int O!d Ou O!u Oo O!o O. O!. Of O!f Oe O!e O# O!# Oc Os !on# int unsi#ned int criture dci9ale signe dci9ale signe

dci9ale non signe unsi#ned !on# int dci9ale non signe unsi#ned int octale non signe unsi#ned !on# int octale non signe unsi#ned int he-adci9ale non signe unsi#ned !on# int he-adci9ale non signe f!oat dci9ale 2irgule :i-e dou"!e f!oat !on# dou"!e f!oat !on# dou"!e unsi#ned char char* dci9ale 2irgule :i-e dci9ale notation e-$onentielle dci9ale notation e-$onentielle dci9ale, re$rsentation la $lus courte $ar9i %! et %, dci9ale, re$rsentation la $lus courte $ar9i %9! et %9, caractAre cha@ne de caractAres

#3

+a,le 4 %CaractAres de con2ersion $our la :onction printf. /n $eut a2oir ,esoin d'inclure dans la cha@ne de caractAres format, un certain no9,re de caract!res spciaux dont la liste est donne ci!dessous. caract?re en C Dn Dt Dv D" Dr Df Da DD DX D3 D) signi&ication :in de ligne ta,ulation horizontale ta,ulation 2erticale retour arriAre retour chariot saut de $age signal sonore ,arre o,li?ue in2erse $oint d'interrogation a$ostro$he guille9et abr#(iation L" H+ V+ BS CR "" B'L ` ] ' P

+a,le 3 %CaractAres s$ciau-

7!2!

Les entr#es ou lectures au cla(ier

7!2!1 La &onction @plus +uste$ent $acroA #etchar @dans stdio.h " <rotot;$e % int #etchar % void & 'lle ren2oie un entier ?ui est le code SC55 du caractAre :ra$$ au cla2ier. 'lle $er9et donc de lire au cla2ier un caractAre et de le stocCer dans une 2aria,le choisie. '-e9$le % char car 2 // dc!aration varia"!e car car : #etchar%& 2 // !ecture dAun caractYre et $ise en p!ace dans car #l faut tre vigilant lorsque l'on utilise cette macro puisque les donnes frappes au clavier ne seront pas prises en compte tant que vous ne les aure$ pas valides par %retour chariot%. 7!2!2. La :onction scanf Idans stdio.hJ <rotot;$e % int scanf % const char *for$at> ... &. La 2aleur retourne $ar scanf est le no9,re d'o,>ets con2ertis et a::ects ou la 2aleur SOZ en cas d'erreur. Cette 2aleur est rare9ent utilise. Les $ara9Atres de la :onction sont constitus des :or9ats et de l'adresse des 2aria,les oL doi2ent Ktre stocCes les donnes saisies au cla2ier. Le code format et le type des arguments doivent tre en correspondance :or9at t;$e d'o,>et $oint Od int Ohd O!d Ou Ohu O!u Oo Oho O!o O. short int !on# int unsi#ned int re$rsentation de la donne saisie dci9ale signe dci9ale signe dci9ale signe dci9ale non signe

unsi#ned short int dci9ale non signe unsi#ned !on# int dci9ale non signe int short int !on# int int octale octale octale he-adci9ale

#.

Oh. O!. Of O!f O;f Oe O!e O;e O# O!# O;# Oc Os

short int !on# int f!oat dou"!e !on# dou"!e f!oat dou"!e !on# dou"!e f!oat dou"!e !on# dou"!e char char*

he-adci9ale he-adci9ale :lottante 2irgule :i-e :lottante 2irgule :i-e :lottante 2irgule :i-e :lottante notation e-$onentielle :lottante notation e-$onentielle :lottante notation e-$onentielle :lottante 2irgule :i-e ou notation e-$onentielle :lottante 2irgule :i-e ou notation e-$onentielle :lottante 2irgule :i-e ou notation e-$onentielle caractAre cha@ne de caractAres

+a,le .% "or9ats de saisie $our la :onction scanf /e$ple : la saisie d'un entier s'crit % int n2 printf % )[onne, !e no$"re de notes : ) &2 ff!ush%stdin&2 scanf % )Od)> Kn &2 printf%);a va!eur entre est : Od Dn)> n &2 Conseil : 1: (ideB s,st#$ati4ue$ent le &lu/ d.entr#e a(ant lecture @utiliseB ff!ush%stdin&2& 2! nCutiliseB pas scanf pour la saisie de chaDne de caract?res EE n e&&et elle ne per$et pas la saisie dCespace dans une chaDne de caract?re! Ainsi scanf%\ Os ]>...& est 1 proscrire,

#=

7!6! Faisie d.une chaDne de caract?res


8ne cha@ne de caractAres est un ta,leau de caractAres, $our Ktre inter$rte correcte9ent le no9,re de caractAres de la cha@ne doit Ktre in:rieur H la $lace dis$oni,le dans le ta,leau 9oins un caractAre, de $lus le dernier caractAre est le caractAre nul '`0' Idont la 2aleur est 0J. insi une cha@ne dclare co99e suit % char chaine[1I :))2 // cha^ne vide initia!ise avec chaine[I :3DI3 ne $ourra co9$orter ?ue B caractAres $lacs de chaineZ0\ H chaineZ=\. 1.(.#. La :onction f#ets % <rotot;$e % char *f#ets%char *s> int n> ZC;S *strea$&2 f#ets lit des caractAres de$uis le :lu- d'entre strea$ et les $lace dans la cha@ne s. La :onction cesse la lecture soit lors?ue n-1 caractAres ont t lus, soit suite H la lecture d'un caractAre de saut de ligne IDnJ Ice caractAre est co$i en :in de cha@neJ. La :in de la cha@ne de caractAres est 9ar?ue $ar l'a>out d'un caractAre nul IDIJ. Le :lu- dEentre stdin corres$ond au cla2ier. &ous $ou2ons donc utiliser f#ets $our la saisie cla2ier % <ar cons?uent $our saisir une cha@ne de caractAres 2ous de2rez saisir % int $ain%void& ' char chaine[16 :))2 int !on#ueur:I2 printf%) Sntre, une chaine de caracteres %17 caractere $a.& Dn)&2 ff!ush%stdin&2 66 .n :i$, 9, amp.n f#ets%chaine>16>stdin&2 66 .n ,% rai a; ma%im;m '< carac =r,- $; !9;% - $in 66 .n - .c>, c,- carac =r,- a 9'a$r,--, cha?n, !on#ueur: str!en%chaine&2 66 .n r@c;p=r, 9a 9.nA;,;r $, 9a cha?n, m.in- ' if %chaine[!on#ueur-1 ::3Dn3& 66 -i 9, $,rni,r carac =r, $, 9a cha?n, ,- r, .;r chari. '\n' '!on#ueur--2 chaine[!on#ueur :3DI32 66 a9.r- .n 9, r,mp9ac, par 9, carac =r, $, !in $, cha?n, ( printf%)voici !a chaine :Os)>chaine&2 66 a!!ich, 9a cha?n, (

#B

8!

Les -nstructions De ContrGle

8!1! Choi/ si$ple ou action conditionnelle if e!se

&orme gnrale if % c.n$i i.n & ' ac i.n-_a9.r-2 ( e!se ' ac i.n-_-in.n2 ( Exemple if % a P " & ' $a. : a2 ( e!se ( $a. : "2

'

8!2!

Choi/ $ultiple switch &orme gnrale switch %ch.i% & ' case :a9' : ac i.n'2 "rea+2 case :a9B : ac i.nB2 "rea+2 +++ case :a9n : ac i.nn2 "rea+2 defau!t : ac i.n_a; r,2 ( Exemple switch %n & ' case 0 : case ' : case C : (

prin !("n;9\n")2 "rea+2

prin !(" r.i-\n")2 "rea+2 defau!t : prin !(",rr,;r\n")2

*0

La valeur de choix ne peut tre qu'un entier ou un caract!re. Les expressions val1 ' valn doivent tre des constantes enti!res ou caract!res. L'instruction break fait sortir de la structure de choix multiple. Si elle est a,sente H la :in du ,loc d'instructions de 2aleur vali, l'e-cution se $oursuit a2ec les instructions de la 2aleur vali+(. 8!6! Boucle whi!e La s;nta-e de whi!e est la sui2ante % whi!e %expression & instruction +ant ?ue e.pression est 2ri:ie Ii.e., non nulleJ, instruction est e-cute. Si expression est nulle au d$art, instruction ne sera >a9ais e-cute. instruction $eut 2ide99ent Ktre une instruction co9$ose. <ar e-e9$le, le $rogra99e sui2ant i9$ri9e les entiers de # H B.

int $ain%void& ' int i : 12 whi!e %i Q 1I& ' printf%)Dn i : Od)>i&2 iJJ2 ( return I2 ( /u encore $our le $arcours d'une cha@ne de caractAres %

int $ain%void& ' int i : I2 char /o$_h-sicien[9I :)Garie Curie) 66 A!!ichaA, $, 9a chain, D.mEhF-ici,n whi!e %/o$_h-sicien[i R: 3DI3& ' printf%)Oc)>/o$_h-sicien[i &2 iJJ2 ( printf%)Dn)&2 66 A!!ichaA, $, 9a chain, D.mEhF-ici,n a:,c 9, !.rma printf%)OsDn)>/o$_h-sicien&2 return I2 (

%-

8!7! Boucle do---whi!e 5l $eut arri2er ?ue l'on ne 2euille e::ectuer le test de continuation ?u'a$rAs a2oir e-cut l'instruction. Dans ce cas, on utilise la ,oucle do---whi!e. Sa s;nta-e est do instruction whi!e %expression &2 5ci, instruction sera e-cute tant ?ue e.pression est non nulle. Cela signi:ie donc ?ue instruction est

*#

tou>ours e-cute au 9oins une :ois. <ar e-e9$le, $our saisir au cla2ier un entier entre # et #0 % int $ain%void& ' int a2 do ' printf%)Dn Sntre, un entier entre 1 et 1I : )&2 scanf%)Od)>Ka&2 ( whi!e %%a Q: I& TT %a P 1I&&2 return I2 ( /u encore $our contraindre une r$onse % int $ain%void& ' char choi.:I2 do ' printf%)Dn Stes vous opti$iste pour votre avenir %O//& : )&2 ff!ush%stdin&2 choi.:#etchar%&2 choi.:toupper%choi.&2 if%choi.R:3/3 KK choi.R:3O3& printf%)Repondre par %O ou /&)&2

( whi!e%choi.R:3/3 KK choi.R:3O3&2 return I2 (

8!8! Boucle for La s;nta-e est % for %expr 1 2expr 2 2expr 3& instruction La $re9iAre e-$ression du for Ie.pr 1J est 2alue a2ant d'entrer dans la ,oucle, la seconde Ie.pr 9) conditionne la $oursuite du for, la troisiA9e Ie.pr LJ est 2alue H cha?ue :in de $arcours. 8ne 2ersion ?ui2alente $lus intuiti2e est% expr 12 whi!e %expr 2 & 'instruction expr 32 (

**

8!9! "estion de caisse


#inc9;$, <- $i.+h> #inc9;$, <c Fp,+h> #$,!in, GHA 0+'IJ in main (:.i$ ) { /* dc!arations */ in n)_:,n ,-=0#na=0; !9.a . a9_:,n ,-=0# m,i99,;r_:,n ,=0; !9.a p;=0# pri%KG=0# a%,=0# pri%GGL=0; char r,p.n-,; /* "ouc!e de saisie et de ca!cu! */ $. { n)_:,n ,- = n)_:,n ,- & '; /* traite$ent de !a vente courante */ /* de$andes */ prin ! ( "M;,9 ,- 9, pri% ;ni air, KG $, :. r, ar ic9, 7 " ); !!9;-h(- $in); -can! ( " %! "# &p; ); prin ! ( "L.m)i,n a:,5/:.;- $'ar ic9,- 7 " ); !!9;-h(- $in); -can!( " %n "# &na ); /*ca!cu!s */ pri%KG = p; 4 na; a%, = pri%KG 4 GHA; pri%GGL = pri%KG & a%, ; /* afficha#e */ prin ! ( ":.- %$ ar ic9,- N %! ,;r.- pi,c, c.; ,n %! KG# , %! GGL \n"# na# p;# pri%KG# pri%GGL ); /* $ise 4 ?our des rcapitu!atifs */ . a9_:,n ,- &= pri%GGL; i! ( pri%GGL > m,i99,;r_:,n , ) { m,i9,;r_:,n , = pri%GGL; } prin ! ("H.;9,5/:.;- c.n in;,r 7 "); !!9;-h(- $in); r,p.n-, = A, char(); } Ohi9, ( .;pp,r (r,p.n-,) 3= DPD ); /* afficha#e des rsu!tats */ prin ! (" H.;- a:,5 ,!!,c ;@ %$ :,n ,- \n "# n)_:,n ,-); prin ! ( " 9a m,i99,;r, $, :.- :,n ,- ,- %! # , 9, . a9 $,- :,n ,- -'@9=:, N %! \n "# m,i99,;r_:,n ,# . a9_:,n ,- );} r, ;rn 0; } /* pour !es !ectures critures*/ /* pour !a fonction toupper*/

*(

Chapitre 2 : Ftructures H %nions H nu$#ration

1! D#&inition De 0,pes Co$pos#s a(ec t-pedef


<our allger l'criture des $rogra99es, on $eut a::ecter un nou2el identi:icateur H un t;$e co9$os H l'aide de t-pedef % t-pedef type synonyme2 <ar e-e9$le% t-pedef unsi#ned int UC/F2 // UC/F est s-non-$e de unsi#ned int int $ain%void& ' UC/F ,2 // , sera un unsi#ned int (

2! Les Ftructures
8ne structure est une suite :inie d'o,>ets de t;$es di::rents. Contraire9ent au- ta,leau-, les di::rents l9ents d'une structure n'occu$ent $as ncessaire9ent des zones contiguas en 99oire. Cha?ue l9ent de la structure, a$$el membre ou champ, est dsign $ar un identi:icateur. /n distingue la dclaration d'un modle de structure de celle d'un o,>et de t;$e structure corres$ondant H un 9odAle donn. La dclaration d'un 9odAle de structure dont l'identi:icateur est modele suit la s;nta-e sui2ante % struct modele 'type_1 membre_12 type_2 membre_22 ... type_n membre_n2 (2 <our dclarer un o,>et de t;$e structure corres$ondant au 9odAle $rcdent, on utilise la s;nta-e % struct modele objet2 ou ,ien, si le 9odAle n'a $as t dclar au $rala,le % struct modele ' type_1 membre_12 type_2 membre_22 ... type_n membre_n2 (objet2 5l est gale9ent $ossi,le de :aire a$$el H t-pedef a:in de s;st9atiser la s;nta-e % // dc!aration d3un t-pe structure t-pedef struct ' type_1 membre_12 type_2 membre_22 type_n membre_n2

*1

( TypeModele2 // dc!aration d3un o"?et de ce t-pe TypeModele objet; /n accAde au- di::rents 9e9,res d'une structure grGce H l'o$rateur membre de structure, not )+). Le i!A9e 9e9,re de o"?et est dsign $ar l'e-$ression objet.membre_i /n $eut e::ectuer sur le i!A9e 9e9,re de la structure toutes les o$rations 2alides sur des donnes de t;$e type)i. <ar e-e9$le, le $rogra99e sui2ant d:init la structure co$p!e.e, co9$ose de deu- cha9$s de t;$e dou"!e Y il calcule la nor9e d'un no9,re co9$le-e.

<inc!ude Q$ath.hP t-pedef struct ' dou"!e ree!!e2 dou"!e i$a#inaire2 ( FCo$p!e.e2 int $ain%void& ' Fco$p!e.e ,2 dou"!e nor$e2 ... nor$e : sqrt%,.ree!!e * ,.ree!!e J ,.i$a#inaire * ,.i$a#inaire&2 printf%)nor$e de %Of J i Of& : Of Dn)>,.ree!!e>,.i$a#inaire>nor$e&2 return I2 ( Les rAgles d'initialisation d'une structure lors de sa dclaration sont les 9K9es ?ue $our les ta,leau-. /n crit $ar e-e9$le % Fco$p!e.e , : '9.1 > 9.1(2 'n &S5 C, on $eut a$$li?uer l'o$rateur d'a::ectation au- structures IH la di::rence des ta,leau-J. Dans le conte-te $rcdent, on $eut crire % ... int $ain%void& ' Fco$p!e.e ,1> ,92 ,1.r:12 ,1.i:92... ,9 : ,12 return I2 (

6! Les Cha$ps De Bits


5l est $ossi,le en C de s$ci:ier la longueur des cha9$s d'une structure au ,it $rAs si ce cha9$ est de t;$e entier Iin ou ;n-iAn,$ in J. Cela se :ait en $rcisant le no9,re de ,its du cha9$ a2ant le ; ?ui suit sa dclaration. <ar e-e9$le, la structure sui2ante struct re#istre ' unsi#ned int actif : 12 unsi#ned int va!eur : L12

*4

(2 $ossAde deu- 9e9,res, actif ?ui est cod sur un seul ,it, et va!eur ?ui est cod sur (# ,its. +out o,>et de t;$e struct re#istre est donc cod sur (* ,its. +oute:ois, l'ordre dans le?uel les cha9$s sont $lacs H l'intrieur de ce 9ot de (* ,its d$end de l'i9$l9entation. Le cha9$ actif de la structure ne $eut $rendre ?ue les 2aleurs 0 et #. ussi, si r est un o,>et de t;$e struct re#istre, l'o$ration r.actif J: 9; ne 9odi:ie $as la 2aleur du cha9$. La taille d'un cha9$ de ,its doit Ktre in:rieure au no9,re de ,its d'un entier. &otons en:in ?u'un cha9$ de ,its n'a $as d'adresse Y on ne $eut donc $as lui a$$li?uer l'o$rateur K.

7! Les %nions
8ne union dsigne un ense9,le de 2aria,les de t;$es di::rents susce$ti,les d'occu$er alternativement une 9K9e zone 99oire. 8ne union $er9et donc de d:inir un o,>et co99e $ou2ant Ktre d'un t;$e au choi- $ar9i un ense9,le :ini de t;$es. Si les 9e9,res d'une union sont de longueurs di::rentes, la $lace rser2e en 99oire $our la re$rsenter corres$ond H la taille du 9e9,re le $lus grand. Les dclarations et les o$rations sur les o,>ets de t;$e union sont les 9K9es ?ue celles sur les o,>ets de t;$e struct! Dans l'e-e9$le sui2ant, la 2aria,le hier de t;$e union ?our $eut Ktre soit un entier, soit un caractAre. union ?our ' char !ettre2 int nu$ero2 (2 int $ain%void& ' union ?our hier> de$ain2 hier.!ettre : 3`32 printf%)hier : OcDn)>hier.!ettre&2 hier.nu$ero : 72 de$ain.nu$ero : %hier.nu$ero J 9& O =2 printf%)de$ain : OdDn)>de$ain.nu$ero&2 return I2 ( Les unions $eu2ent Ktre utiles lors?u'on a ,esoin de 2oir un o,>et sous des t;$es di::rents I9ais en gnral de 9K9e tailleJ. <ar e-e9$le, le $rogra99e sui2ant $er9et de 9ani$uler en 9K9e te9$s les deu- cha9$s de t;$e unsi#ned int d'une structure en les identi:iant H un o,>et de t;$e unsi#ned !on# Ien su$$osant ?ue la taille d'un entier !on# est deu- :ois celle d'un intJ.

t-pedef struct ' unsi#ned int .2 unsi#ned int -2 ( FCoordonnees2 union point ' Fcoordonnees coord2 unsi#ned !on# $ot2 (2 int $ain%void& '

*3

union point p1> p9> pL2 p1.coord.. : I.f2 p1.coord.- : I.12 p9.coord.. : I.M2 p9.coord.- : I.M2 pL.$ot : p1.$ot V p9.$ot2 printf%)pL.coord.. : O. Dt pL.coord.- : O.Dn)> pL.coord..> pL.coord.-&2 return I2 (

8! Les #nu$#rations
Les nu9rations $er9ettent de d:inir un t;$e $ar la liste des 2aleurs ?u'il $eut $rendre. 8n o,>et de t;$e nu9ration est d:ini $ar le 9ot!cle: enu$ et un identi:icateur de 9odAle, sui2is de la liste des 2aleurs ?ue $eut $rendre cet o,>et % enu$ modele 'constante_1> constante_2>...>constante_n(2 'n ralit, les o,>ets de t;$e enu$ sont re$rsents co99e des int. Les 2aleurs $ossi,les constante_1, constante_2>...>constante_n sont codes $ar des entiers de 0 H n-1. <ar e-e9$le, le t;$e enu$ "oo!een d:ini dans le $rogra99e sui2ant associe l'entier 0 H la 2aleur fau. et l'entier 1 H la 2aleur vrai. int $ain%void& ' enu$ "oo!een 'fau.:I> vrai:1(2 enu$ "oo!een "2 " : vrai2 printf%)" : OdDn)>"&2 return I2 ( /n $eut 9odi:ier le codage $ar d:aut des 2aleurs de la liste lors de la dclaration du t;$e nu9r, $ar e-e9$le % enu$ "oo!een 'fau. : 19> vrai : 9L(2

*.

Chapitre 6 : Les 'ointeurs

+oute 2aria,le 9ani$ule dans un $rogra99e est stocCe ?uel?ue $art en 99oire centrale. Cette 99oire est constitue d'octets ?ui sont identi:is de 9aniAre uni2o?ue $ar un nu9ro ?u'on a$$elle adresse. <our retrou2er une 2aria,le, il su::it donc de conna@tre l'adresse de l'octet oL elle est stocCe Iou, s'il s'agit d'une 2aria,le ?ui recou2re $lusieurs octets contigus, l'adresse du $re9ier de ces octetsJ. <our des raisons 2identes de lisi,ilit, on dsigne sou2ent les 2aria,les $ar des identi:icateurs, et non $ar leur adresse. C'est le co9$ilateur ?ui :ait alors le lien entre l'identi:icateur d'une 2aria,le et son adresse en 99oire. +oute:ois, il est $ar:ois trAs $rati?ue de 9ani$uler directe9ent une 2aria,le $ar son adresse.

1! Adresse et (aleur d.un ob+et


/n a$$elle Lvalue Ile:t 2alueJ tout o,>et $ou2ant Ktre $lac H gauche d'un o$rateur d'a::ectation. 8ne Lvalue est caractrise $ar %

son adresse, c'est!H!dire l'adresse!99oire H $artir de la?uelle l'o,>et est stocC Y sa 2aleur, c'est!H!dire ce ?ui est stocC H cette adresse.

Dans l'e-e9$le,
int i> ?2 i : L2 ? : i2 Si le co9$ilateur a $lac la 2aria,le i H l'adresse 1=(#=(3000 en 99oire, et la 2aria,le Q H l'adresse 1=(#=(3001, on a o,>et adresse i Ki: 7ML1ML5III ? K?: 7ML1ML5II7 2aleur ( (

Deu- 2aria,les di::rentes ont des adresses di::rentes. L'a::ectation i : ?; n'o$Are ?ue sur les 2aleurs des 2aria,les. Les 2aria,les i et ? tant de t;$e int, elles sont stocCes sur 1 octets. insi la 2aleur de i est stocCe sur les octets d'adresse 1=(#=(3000 H 1=(#=(300(. L'adresse d'un o,>et tant un nu9ro d'octet en 99oire, il s'agit d'un entier ?uel?ue soit le t;$e de l'o,>et considr. Le :or9at interne de cet entier I#3 ,its, (* ,its ou 31 ,itsJ d$end des architectures. L'o$rateur K $er9et d'accder H l'adresse d'une 2aria,le. +oute:ois Ki n'est $as une Lvalue 9ais une constante, en e::et on ne $eut $as :aire :igurer Ki H gauche d'un o$rateur d'a::ectation. <our $ou2oir 9ani$uler des adresses, on doit donc recourir un nou2eau t;$e d'o,>ets, les $ointeurs.

2! Notion de pointeur
8n pointeur est un o,>et ILvalueJ dont la 2aleur est gale H l'adresse d'un autre o,>et. /n dclare un $ointeur $ar l'instruction % t-pe *nom-du-pointeur2 oL type est le t;$e de l'o,>et $oint. Cette dclaration dclare un identi:icateur, nom-du-pointeur# associ H un o,>et dont la 2aleur est l'adresse d'un autre o,>et de t;$e type. L'identi:icateur no$-du-pointeur est donc en ?uel?ue sorte un identi:icateur d'adresse. Co99e $our n'i9$orte ?uelle Lvalue, sa 2aleur est 9odi:ia,le. MK9e si la 2aleur d'un $ointeur est tou>ours un entier I2entuelle9ent un entier longJ, le t;$e d'un $ointeur d$end du

*=

t;$e de l'o,>et 2ers le?uel il $ointe. Cette distinction est indis$ensa,le H l'inter$rtation de la 2aleur d'un $ointeur. 'n e::et, $our un $ointeur sur un o,>et de t;$e char, la 2aleur donne l'adresse de l'octet oL cet o,>et est stocC. <ar contre, $our un $ointeur sur un o,>et de t;$e int, la 2aleur donne l'adresse du $re9ier des 1 octets oL l'o,>et est stocC. L'oprateur unaire d'indirection * $er9et d'accder directe9ent H la 2aleur de l'o,>et $oint. 2ant d'utiliser cet o$rateur unaire il :aut 2eiller H ce ?ue le $ointeur soit initialis. La constante s;9,oli?ue &8LL I0 en dci9aleJ a::ecte H un $ointeur signi:ie, $ar con2ention, ?u'il ne $ointe sur aucun o,>et. '-e9$le de $rogra99e % int $ain%void& ' int i : L2 int *p : Ki2 66 p p.in , -;r i printf%)*p : Od i: OdDn)>*p>i&2 *p:I2 printf%)*p : Od i:OdDn)>*p>i&2 return I2 ( i9$ri9e *p : L i:L *p:I i:I! Dans ce $rogra99e, les o,>ets i et *p sont identi?ues. &ous so99es dans la con:iguration % o,>et adresse i Ki:7ML1ML5III p Kp:7ML1ML5II7 2aleur L 7ML1ML5III

/n $eut donc dans un $rogra99e 9ani$uler H la :ois les o,>ets p et *p. Ces deu- 9ani$ulations sont trAs di::rentes. Co9$arons $ar e-e9$le les deu- $rogra99es sui2ants %

int $ain%void& ' int i : L> ? : 52 int *p1> *p92 p1 : Ki2 p9 : K?2 *p1 : *p92 return I2 (

int $ain%void& ' int i : L> ? : 52 int *p1> *p92 p1 : Ki2 p9 : K?2 p1 : p92 return I2 (

*B

2ant la derniAre a::ectation de chacun de ces $rogra99es, on est dans une con:iguration du t;$e % o,>et i ? p1 p9 adresse Ki:7ML1ML5III K?:7ML1ML5II7 Kp1:7ML1ML6UM7 Kp9:7ML1ML6UU9 2aleur L 5 7ML1ML5III 7ML1ML5II7

$rAs l'a::ectation *p1 : *p9; du $re9ier $rogra99e, on a o,>et i ? p1 p9 adresse Ki:7ML1ML5III K?:7ML1ML5II7 Kp1:7ML1ML6UM7 Kp9:7ML1ML6UU9 2aleur 5 5 7ML1ML5III 7ML1ML5II7

<ar contre, l'a::ectation p1 : p9 du second $rogra99e, conduit H la situation % o,>et i ? p1 p9 adresse Ki:7ML1ML5III K?:7ML1ML5II7 Kp1:7ML1ML6UM7 Kp9:7ML1ML6UU9 2aleur L 5 7ML1ML5II7 7ML1ML5II7

6! Arith$#ti4ue des pointeurs


La 2aleur d'un $ointeur tant un entier, on $eut lui a$$li?uer un certain no9,re d'o$rateurs arith9ti?ues classi?ues. Les seules o$rations arith9ti?ues 2alides sur les $ointeurs sont%

l'addition d'un entier H un $ointeur. Le rsultat est un $ointeur de 9K9e t;$e ?ue le $ointeur de d$art Y la soustraction d'un entier H un $ointeur. Le rsultat est un $ointeur de 9K9e t;$e ?ue le $ointeur de d$art Y la di::rence de deu- $ointeurs $ointant tous deu- 2ers des o,>ets de 9K9e t;$e. Le rsultat est un entier corres$ondant au no9,re d'o,>ets $rsents entre les deu- adresses.

Notons 4ue la so$$e de deu/ pointeurs n.est pas autoris#e! Si i est un entier et p est un $ointeur sur un o,>et de t;$e type, l'e-$ression pJi dsigne un $ointeur sur un o,>et de t;$e type dont la 2aleur est gale H la 2aleur de p incr9ente de i*si,eof%type&. 5l en 2a de 9K9e $our la soustraction d'un entier H un $ointeur, et $our les o$rateurs d'incr9entation et de dcr9entation && et //. <ar e-e9$le, le $rogra99e

int $ain%void& ' int i : L2 int *p1:/U;;> *p9:/U;;2 p1 : Ki2 p9 : p1 J 12 printf%)p1 : O!d Dt p9 : O!dDn)>p1>p9&2 return I2 (

(0

a::iche p1 : 7ML1ML6UM7

p9 : 7ML1ML6UMM+ 66 p.;r $,- in

c.$@- -;r < .c , -

<ar contre, le 9K9e $rogra99e a2ec des $ointeurs sur des o,>ets de t;$e dou"!e % int $ain%void& ' dou"!e i : L2 dou"!e *p1:/U;;> *p9:/U;;2 p1 : Ki2 p9 : p1 J 12 printf%)p1 : O!d Dt p9 : O!dDn)>p1>p9&2 return I2 (

a::iche p1 : 7ML1ML6UM7

p9 : 7ML1ML6UU9.

Les o$rateurs de co9$araison sont gale9ent a$$lica,les au- $ointeurs, H condition de co9$arer des $ointeurs ?ui $ointent 2ers des o,>ets de 9K9e t;$e. L'utilisation des o$rations arith9ti?ues sur les $ointeurs est $articuliAre9ent utile $our $arcourir des ta,leau-. insi, le $rogra99e sui2ant i9$ri9e les l9ents du ta,leau ta" dans l'ordre croissant des indices. <define / 6 int $ain%void& ' int ta"[/ : '1> 9> 5> I> =(2 int *p:/U;;2 int i:I2 printf%)Dn ordre croissant:Dn)&2 for %p : Kta"[I 2 p Q: Kta"[/-1 2 pJJ& // de $aniYre quiva!ente p:Kta"[I 2 // Q:P p:ta"2 printf%)Dn ordre croissant:Dn)&2 for%i:I2iQ/2iJJ& printf%) Od Dn)>p[i &2 return I2 (

printf%) Od Dn)>*p&2

'n rsu9, si p:ta" Iou encore p:Kta"[I J, il ; a les ?ui2alences sui2antes % p[i Kp[i Q:P Q:P *%pJi& %pJi& Q:P Q:P ta"[i Kta"[i

Si p et q sont deu- $ointeurs sur des o,>ets de t;$e type, l'e-$ression p-q dsigne un entier dont la 2aleur est gale H @p H qAIsi,eof%type&> c3est 4 dire !e no$"re d3o"?et de t-pe type ui peuvent prendre pa!ce entre !es adresses p et q.

7! 'ointeurs et constantes
Le 9ot!cle: const $er9et de $rotger des zones en criture, associ H un $ointeur cela conduit H $lusieurs cas de

(#

:igure. int i:I>?:I2 1. const int *pi:Ki2 64 pi p.in , -;r i# c',- 4pi R;i ,- c.n- an 46 9. int *const p?:K?2 64 pQ p.in , -;r Q# c',- pQ R;i ,- c.n- an 46 L. const int *const p+:K+2 64 p> p.in , -;r ># p> , 4p> -.n c.n- an - 46 L'e-e9$le ci dessous e-$licite les co9$orte9ents % <inc!ude Qstdio.hP void $ain%void& ' int i> ?> +2 const int *pi:Ki2 64 pi p.in , -;r i# c',- 4pi R;i ,- c.n- an 46 int *const p?:K?2 64 pQ p.in , -;r Q# c',- pQ R;i ,- c.n- an 46 const int *const p+:K+2 64 p> p.in , -;r ># p> , 4p> -.n c.n- an - 46 pi : K?2 *pi : 62 iJJ2 p? : Ki2 *p? : i2 ?JJ2 p+ : Ki2 *p+ : ?2 +JJ2 ( 64 in- r;c i.n 9@Aa9, 46 64 ,rr,;r $, c.mpi9a i.n# pr. ,c i.n ,n @cri ;r, $, 4pi 46 64 in- r;c i.n 9@Aa9, 46 64 ,rr,;r $, c.mpi9a i.n#pr. ,c i.n ,n @cri ;r, $, pQ 46 64 in- r;c i.n 9@Aa9, 46 64 in- r;c i.n 9@Aa9, 46 64 ,rr,;r $, c.mpi9a i.n 46 64 ,rr,;r $, c.mpi9a i.n 46 64 in- r;c i.n 9@Aa9, 46

8! 'ointeurs et structures
Contraire9ent au- ta,leau-, les o,>ets de t;$e structure en C sont des Lvalues. 5ls $ossAdent une adresse, corres$ondant H l'adresse du $re9ier l9ent du $re9ier 9e9,re de la structure. /n $eut donc 9ani$uler des $ointeurs sur des structures. Si p est un $ointeur sur une structure, on $eut accder H un 9e9,re de la structure $oint $ar l'e-$ression %*p&.membre L'usage de $arenthAses est ici indis$ensa,le car l'o$rateur d'indirection * H une $riorit $lus le2e ?ue l'o$rateur de 9e9,re de structure. Cette notation $eut Ktre si9$li:ie grGce H l'o$rateur pointeur de membre de structure, not -P. L'e-$ression $rcdente est stricte9ent ?ui2alente H p-Pmembre Dans l'e-e9$le ci dessous il est 9ontr co99ent un $ointeur $er9et de dsigner un l9ent d'un ta,leau de structure.

<inc!ude Qstd!i".hP <inc!ude Qstdio.hP <define / U5 t-pedef struct ' int id2 int poids2 ( F_ou!et2

(*

int $ain%void& ' int n:I> i2 F_ou!et ta"[/ 2 Fpou!et * pSur_ou!et:/U;;2 66 p.in ,;r p.in an do ' printf%)no$"re de _ou!ets %I-Od&X)>/&2 ff!ush%stdin&2 scanf%)Od)>Kn&2 ( whi!e %nQI KK nP/&2 for %i :I 2 i Q n2 iJJ& ' printf%)Dn saisie du _ou!et nu$ero OdDn)>i&2 printf%)identifiant du _ou!et : )&2 ff!ush%stdin&2 scanf%)Od)>Kta"[i .id&2 ff!suh%stdin&2 printf%)Dn poids en # : )&2 scanf%)Od)>Kta"[i .poids&2 ( do ' printf%)Dn Sntre, un nu$ero ff!ush%stdin&2 scanf%)Od)>Ki&2 ( whi!e %iQI KK iPn&2 pSur_ou!et:Kta"[i 2 printf%)Dn _ou!et nu$ero Od:)>i&2 printf%)Dn Cdentifiant Od:)>pSur_ou!et-Pid&2 printf%)Dn poids : OdDn)>pSur_ou!et-Ppoids&2 ( return I2 )&2

-;r ri,n

((

Chapitre 7 : Les ChaDnes De Caract?res

1!

D#&inition t D#claration Des ChaDnes De Caract?res n C


Co99e dit $rcde99ent une cha*ne est vue comme un tableau de caract!res. C'est un ta,leau ?ui se ter9ine $ar le caractAre nul .J0. Idont la 2aleur est 0J de :aDon H $ou2oir en dtecter la :in. La $lace ?u'il occu$e en 99oire est donc su$rieure d'une unit au no9,re de caractAres e::ecti:s ?u'il $eut contenir. 5l ; a $lusieurs :aDons de dclarer une cha@ne de caractAres % char nom[1I : )!e chat)2 ou char nom[ : )!e chat)2 // tai!!e a?uste auto$atique$ent 4 M Remarques : ! 8ne cha@ne de caractAres constante est un te-te encadr de ) et de ), H ne $as con:ondre a2ec un caractAre constant ?ui lui est encadr de . et de .. insi ' ' est le caractAre alors ?ue P P est la cha@ne c'est!H!dire le caractAre sui2i du caractAre nul I3DI3J. ! 8ne cha@ne de caractAres constante se 2oit a::ecter une adresse $ar le co9$ilateur lors de son criture, ainsi les lignes sui2antes sont 2alides % char *p/o$2 p/o$ : )!e chat)2 l'instruction d'affectation ralise l'affectation de l'adresse de %le chat% au pointeur p/o$. +e n'est en aucun cas une copie de cha*ne ,ou de caract!res" Le $ointeur p/o$ $eut alors Ktre utilis $our $arcourir une cha@ne de caractAres % int $ain%void& b int i:I2 char *p/o$2 char Chaine[ : )!e chat)2 p/o$:Chaine2 // Q:P p/o$:KChaine[I 2 whi!e %*p/o$R:3DI3& ' printf%)Oc)>*p/o$&2 *p/o$JJ2 ( printf%)Dn)&2 // ce qui est quiva!ent 4 whi!e %p/o$[i R:3DI3& ' printf%)Oc)>p/o$[i &2 iJJ2 ( printf%)Dn)&2 // ou encore printf%)OsDn)>p/o$&2 return I2 (

(1

2!

Faisie d.une chaDne de caract?res f#ets


_rotot-pe dans Qstdio.hP char K &gets @ char K str, int nu$, L-L K strea$ A*

Lit les caractAres de$uis le :lu- d'entre strea$ et les $lace dans la cha@ne str tant ?ue nu$-1 caractAres n'ont $as t lus et ?ue le caractAre lu est di::rent du caractAre saut de ligne (3Dn3) (ce caractAre est co$i en :in de cha@neJ et ?ue l'on n'est $as en :in de :lu-. La :in de la cha@ne de caractAres est 9ar?ue $ar l'a>out d'un caractAre nul (DI)+ Cette :onction retourne str en cas de succAs, et un $ointeur /U;; en cas de :in de :lu-. Le :lu- dEentre stdin corres$ond au cla2ier. /n ra$$elle donc ici les instructions $rconises $our assurer la saisie cla2ier d'une cha@ne de caractAres % int $ain%void& ' char chaine[16 :))2 int !on#ueur:I2 printf%) Sntre, une chaine de caracteres %17 caractere $a.& Dn)&2 ff!ush%stdin&2 66 .n :i$, 9, amp.n f#ets%chaine>16>stdin&2 66 .n ,% rai a; ma%im;m '< carac =r,- $; !9;% - $in 66 .n - .c>, c,- carac =r,- a 9'a$r,--, cha?n, !on#ueur: str!en%chaine&2 66 .n r@c;p=r, 9a 9.nA;,;r $, 9a cha?n, m.in- ' if %chaine[!on#ueur-1 ::3Dn3& 66 -i 9, $,rni,r carac =r, $, 9a cha?n, ,- r, .;r chari. '\n' '!on#ueur--2 chaine[!on#ueur :3DI32 66 a9.r- .n 9, r,mp9ac, par 9, carac =r, $, !in $, cha?n, ( printf%)voici !a chaine :Os)>chaine&2 66 a!!ich, 9a cha?n, (

6! >ecopie d.une chaDne de caract?res strcp-> strncp_rotot-pe dans Qstrin#.hP char * strcp- % char * destination> const char * source &2 Co$ie la cha@ne $ointe $ar source 2ers la cha@ne $ointe $ar destination. <our 2iter des d,orde9ents de 99oire il :aut s'assurer ?ue la taille du ta,leau $oint $ar destination est su::isante $our contenir la cha@ne source IcaractAre de :in de cha@ne co9$risJ. Le $ointeur destination est retourn. _rotot-pe dans Qstrin#.hP char * strncp- % char * destination> const char * source> si,e_t num &2 Co$ie les num $re9iers caractAres de source 2ers destination. Si la :in de la cha@ne source est rencontr a2ant ?ue num caractAres soient co$is destination est co9$lts de caractAres nul !"#$"%. Le $ointeur destination est retourn.

7! Concat#nation de chaDnes strcat> strncat


_rotot-pe dans Qstrin#.hP

(4

char * strcat % char * destination> const char * source &2 >oute une co$ie de la cha@ne source H la cha@ne destination. La caractAre de :in de cha@ne de destination est re9$lac $ar le $re9ier caractAre de source, et un nou2eau caractAre de :in de cha@ne est a>out H la :in de la nou2elle cha@ne rsultante destination. Le ta,leau de caractAres $oint $ar destination doit Ktre su::isa99ent grand $our accueillir la cha@ne concatne. Le $ointeur destination est retourn. _rotot-pe dans Qstrin#.hP char * strncat % char * destination> char * source> si,e_t nu$ &2 >oute les num $re9iers caractAres de source H destination, $lus un caractAre :in de cha@ne. Si la longueur de la cha@ne source est in:rieure H num, seul les caractAres $rcdents le caractAre :in de cha@ne sont reco$is. Le ta,leau de caractAres $oint $ar destination doit Ktre su::isa99ent grand $our accueillir la cha@ne concatne. Le $ointeur destination est retourn.

8! Co$paraison de chaDnes strc$p> strnc$p


_rotot-pe dans Qstrin#.hP int strc$p % const char * str1> const char * str9 &2 Co9$are les cha@nes str1 et str2. Cette :onction d,ute $ar la co9$araison du $re9ier caractAre de cha?ue cha@ne. S'ils sont gau-, elle continue a2ec la $aire de caractAres sui2ants tant ?ue les caractAres sont gau- et ?u'un caractAre :in de cha@ne n'est $as atteint. Cette :onction retourne un entier indi?uant la relation d'ordre entre les deu- cha@nes % 8n zro signi:ie ?ue les deu- cha@nes sont gales 8ne 2aleur $ositi2e indi?ue ?ue le $re9ier caractAre di::rent a une $lus grande 2aleur dans str1 ?ue dans str2 8ne 2aleur ngati2e indi?ue l'in2erse. _rotot-pe dans Qstrin#.hP int strnc$p % const char * str1> const char * str2> si,e_t num &2 Cette :onction d,ute $ar la co9$araison du $re9ier caractAre de cha?ue cha@ne. S'ils sont gau-, elle continue a2ec la $aire de caractAres sui2antes tant ?ue les caractAres sont gau- et ?u'un caractAre :in de cha@ne n'est $as atteint et ?ue num caractAres n'ont $as t co9$ars. Cette :onction retourne un entier indi?uant la relation d'ordre entre les deucha@nes % 8n zro signi:ie ?ue les num $re9iers caractAres des deu- cha@nes sont gau-. 8ne 2aleur $ositi2e indi?ue ?ue le $re9ier caractAre di::rent a une $lus grande 2aleur dans str1 ?ue dans str2 8ne 2aleur ngati2e indi?ue l'in2erse.

9! Longueur d.une chaDne str!en


_rotot-pe dans Qstrin#.hP si,e_t str!en % const char * str &2 Retourne un entier gal H la longuer de la cha@ne str. La longueur d'une cha@ne corres$ond au no9,re de caractAre entre le d,ut de la cha@ne et le caractAre :in de cha@ne 3DI3. ne $as con:ondre a2ec la taille du ta,leau, $ar e-e9$le % char GaChaine[1II :)chaine test)2 de:init un ta,leau de 1II caractAres 9ais la cha@ne GaChaine a une longuer de 11 caractAres. <ar cons?uent si,eof%GaChaine& retourne 1II, et str!en%GaChaine& retourne 11.

(3

:! >echerche d.une chaDne dans une autre strstr


_rotot-pe dans Qstrin#.hP char * strstr % const char * str1> const char * str2&2 Retourne un $ointeur sur la $re9iAre occurrence de la cha@ne str2 dans la chaine str1, ou un $ointeur &8LL si str2 n'est $as une $artie de str1. La co9$araison ne $orte $as sur le caractAre :in de cha@ne.

8! 0est de caract?res isap!ha>isa!nu$> is!ower> isupper


protot-pe dans Qct-pe.hP int isa!pha % int c &2 retourne 0 si c n'est $as un caractAre al$ha,ti?ue int isa!nu$ % int c &2 retourne 0 si c n'est $as un caractAre al$hanu9ri?ue int is!ower % int c &2 retourne 0 si c n'est $as un caractAre 9inuscule int isupper % int c &2 retourne 0 si c n'est $as un caractAre 9a>uscule

9! >echerche de caract?res dans une chaDne strchr>str"r+


_rotot-pe dans Qstrin#.hP char * strchr%char * str> int c&aracter&2 Retourne un $ointeur sur la $re9iAre occurrence de character dans la cha@ne str. Le caractAre :in de cha@ne est considr, $ar cons?uent cette :onction $eut Ktre utilise $our localiser la :in d'une cha@ne. _rotot-pe dans Qstrin#.hP char * str"r+%char * str> int c&aracter&2 Retourne un $ointeur sur la $re9iAre occurrence dans str1 d'un des caractAres de str2, ou un $ointeur &8LL si aucun caractAre ne s'; trou2e. La recherche ne co9$rend $as le caractAre de :in de cha@ne. /e$ple : /* strp"r+ e.e$p!e d3uti!isation> e.traction des vo-e!!es */ <inc!ude Qstdio.hP <inc!ude Qstrin#.hP int $ain %& ' char str[ : )Fhis is a sa$p!e strin#)2 char +e-[ : )aeiou)2 char * pch2 printf %)0owe!s in 3Os3: )>str&2 pch : strp"r+ %str> +e-&2 whi!e %pch R: /U;;& ' printf %)Oc ) > *pch&2 pch : strp"r+ %pchJ1>+e-&2 ( printf %)Dn)&2 return I2 ( :ournit l'a::ichage sui2ant % 0owe!s in 3Fhis is a sa$p!e strin#3: i i a a e i

(.

10! /traction de chaDne strto+


_rotot-pe dans Qstrin#.hP char * strto+%char * str> const char * delimiters&2 8ne s?uence d'a$$el de cette :onction s$are la cha@ne str en $lusieurs sous cha@nes. Lors du $re9ier a$$el la :onction attend en $ara9Atre une cha@ne de caractAres co99e argu9ent str, dont le $re9ier caractAre est utilis $our d,uter la recherche des >etons $rsents dans la cha@ne delimiters. Lors des a$$els sui2ants, la :onction attend un $ointeur /U;; et utilise la $osition H droite de la derniAre sous cha@ne co99e nou2eau $oint de d$art $our la recherche. <our dter9iner le d,ut et la :in d'une sous cha@ne la :onction recherche du $oint de d$art la $re9iAre occurrence d'un caractAre ?ui n'est $as contenu dans la cha@ne delimiters. <uis d9arrant de ce d,ut de cha@ne elle recherche la $rochaine occurrence dans str d'un caractAre de la cha@ne delimiters, ce caractAre de2ient la :in de la sous cha@ne. Cette :in de sous cha@ne est auto9ati?ue9ent re9$lace $ar un caractAre :in de cha@ne et le d,ut de la sous cha@ne sui2ante est retourn. Lors?ue le caractAre :in de cha@ne de str a t trou2 lors d'un a$$el H strtok, tous les a$$els successi:s H cette :onction a2ec un $ointeur /U;; co99e $re9ier argu9ent retourne un $ointeur /U;;.

/* strto+ e.traction de sous cha^nes */ <inc!ude Qstdio.hP <inc!ude Qstrin#.hP int $ain %& ' char str[ :)- Fhis> a sa$p!e strin#.)2 char * pch2 printf %)Separation de chaine D)OsD) en sous chaine:Dn)>str&2 pch : strto+ %str>) >.-)&2 669,- $@9imi ,;r- -.n ,-pac,# :irA;9,# p.in , ir, whi!e %pch R: /U;;& ' printf %)OsDn)>pch&2 pch : strto+ %/U;;> ) >.-)&2 ( return I2 ( ::ichage cran % Separation de chaine )- Fhis> a sa$p!e strin#.) en sous chaine: Fhis a sa$p!e strin#

11! Duplication de chaDne strdup


_rotot-pe dans Qstrin#.hP char *strdup%const char *s1& Du$li?ue la cha@ne s1, la 99oire alloue doit Ktre li,re $ar l'utilisateur I:onction freeJ.

(=

Le $ointeur de retour s$ci:ie l'e9$lace9ent rser2 $our la nou2elle cha@ne, il 2aut /U;; en cas d'chec. "onction non standard &S5. La cha@ne doit Ktre li,re $ar l'utilisateur ensuite. '-e9$le % int $ain%void& ' char s1[ : );a phrase initia!e)2 char * s9:/U;;2 s9:strdup%s1&2 strcp-%s1> )nouveau)>&2 printf%)Os)>s1&2 printf%)Os)>s9&2 free%s9&2 // !i"ration de !a $$oire a!!oue par strdup ( ::ichage cran% nouveau ;a phrase initia!e

(B

Chapitre 8 : Les Lonctions

1! D#&inition d.une Lonction


La d:inition d'une :onction est la donne du te-te de son algorith9e, ?u'on a$$elle cor$s de la :onction. 'lle est de la :or9e % type nom-'onction %type_1 ar(_1>...>type_n ar(_n& 'd)clarations de variables locales liste d"instructions ( La $re9iAre ligne de cette d:inition est l'en-tte de la :onction. Dans cet en!tKte, type dsigne le t;$e de la :onction, c'est!H!dire le t;$e de la 2aleur ?u'elle retourne. 8ne :onction ?ui ne ren2oie $as de 2aleur est une :onction dont le t;$e est s$ci:i $ar le 9ot!cle: void. Les argu9ents de la :onction sont a$$els paramtres formels, $ar o$$osition au- paramtres effectifs ?ui sont les $ara9Atres a2ec les?uels la :onction est e::ecti2e9ent a$$ele. Les $ara9Atres :or9els $eu2ent Ktre de n'i9$orte ?uel t;$e. Leurs identi:icateurs n'ont d'i9$ortance ?u'H l'intrieur de la :onction. 'n:in, si la :onction ne $ossAde $as de $ara9Atres, on re9$lace la liste de $ara9Atres :or9els $ar le 9ot!cle: void. Le cor$s de la :onction d,ute 2entuelle9ent $ar des dclarations de 2aria,les, ?ui sont locales H cette :onction. 5l se ter9ine $ar l'instruction de retour la fonction appelante, return, dont la s;nta-e est return%expression&2 La 2aleur de e.pression est la 2aleur ?ue retourne la :onction. Son t;$e doit Ktre le 9K9e ?ue celui ?ui a t s$ci:i dans l'en!tKte de la :onction. Si la :onction ne retourne $as de 2aleur I:onction de t;$e voidJ, sa d:inition s'achA2e $ar return2 <lusieurs instructions return $eu2ent a$$ara@tre dans une :onction. Le retour au $rogra99e a$$elant sera alors $ro2o?u $ar le $re9ier return rencontr lors de l'e-cution. 1!1! D#claration des para$?tres &or$els d.une &onction +rois t;$es de $ara9Atres :or9els se dgagent % Les param!tres d'entre, on a$$elle un param!tre d'entre une 2aria,le ?ui est :ournie H la :onction $ar le 9odule a$$elant. La :onction n'accAde ?u'en lecture H la 2aria,le. Les param!tres de sortieon a$$elle un param!tre de sortie une 2aria,le ?ui est :ournie $ar la :onction au 9odule a$$elant. Les param!tres d'entre.sortieon a$$elle un param!tre d'entre/sortie une 2aria,le ?ui est :ournie H la :onction $ar le 9odule a$$elant. Cette 2aria,le est accessi,le en lectureTcriture $ar la :onction.

1!2! 'our les para$?tres d.entr#e :


1!2!1! /n $asse la 2aleur du $ara9Atre I$assage d'une 2aria,le :loat, int, char, dou,le, long,...J, il s'agit d'une reco$ie de la 2aria,le

10

/8 1!2!2! /n $asse un $ointeur sur constante ?ui contient l'adresse de la 2aria,le I$assage de l'adresse d'une 2aria,le ,...J, on accAde H la 2aria,le en lecture uni?ue9ent.

1!6! 'our les para$?tres de sortie


/n retourne une 2aria,le, utilisation du return. La 2aria,le est reco$ie dans le $ara9Atre e::ecti: de retour.

1!7! 'our les para$?tres d.entr#eIsortie :


/n $asse un $ointeur ?ui contient la 2aleur de la 2aria,le I $assage de l'adresse d'une 2aria,le,...J, la 2aria,le est accessi,le en lecture et en criture de$uis la :onction.

2! /e$ple d.utilisation de &onctions 2!1! Lonction a,ant 6 para$?tres d.entr#e et un para$?tre de sortie
La :onction equation1 retourne une 2aria,le de t;$e f!oat contenant la so99e de trois 2aria,les de t;$e f!oat $asses en entre. 64444 $@c9ara i.n $';n, !.nc i.n <=> pr. . Fp, $,- !.nc i.n- 444444444446 64 !.nc i.n aFan C param= r,- $',n r@, , ;n param= r, $, -.r i, f!oat equation1%f!oat > f!oat > f!oat &2 64 L.$, $; m.$;9, app,9an 46

void $ain%void& 'f!oat a!pha:9> "eta:62 f!oat .:L>w2 dou"!e ->,2 66 App,9 $, 9a !.nc i.n ,R;a i.n ' R;i a--;r, 9, ca9c;9 $, F=a4%&) 66 9,- :a9,;r- $, %# a9pha , ), a -.n r,c.pi@- $an- a#% , ) -:equation1%.>a!pha>"eta&2 w:equation1%9>6>M&2 66 a; an ( $'app,9 R;, :.;9;

f!oat equation1%f!oat a> f!oat .> f!oat "& ' return%a*.J"&2 (

2!2! Lonction a,ant 1 para$?tre d.entr#eI sortie


La :onction co$pte incr9ente une 2aria,le de t;$e int $asse en entre, cette 2aria,le est 9odi:ie $ar la :onction.

1#

64444 $,c9ara i.n $';n !.nc i.n <=> pr. . Fp, $,- !.nc i.n- 444444444446 void co$pte%int * &2 64 9a !.nc i.n c.mp , r,S.i 9, p.in ,;r -;r ;n, :aria)9, $, Fp, ,n i,r# c, :arai)9, -,ra acc,--i)9, ,n 9,c ;r, , ,n @cri ;r, 46

64 L.$, $; m.$;9, app,9an 46 void $ain%void& ' int i:I2 co$pte%Ki&2 66 app,9 $, 9a !.nc i.n# n. .n- 9'.p@ra ,;r K $,:an 9a :ari)a9, i printf%)i:Od)>i&2 co$pte%Ki&2 printf%) i:Od> )>i&2 ( 64 $@!ini i.n $, 9a !.nc i.n c.mp , 46 void co$pte%int * p?& ' *p?:*p?J12 66 n. .n- 9'.p@ra ,;r * R;i p,rm, 9'acc,- N 9a :aria)9, $, Fp, int 66-i ;@, N 9'a$r,--, p? ( Ce $rogra99e a::iche % i:1> i:9>

2!6 Lonction a,ant 2 para$?tres d.entr#e et 2 para$?tres de sortie


La :onction equation9 calcule et :ournit le 9odule et l'argu9ent de deu- f!oat $asss en entre. <define pi L.1716= 64444 $,c9ara i.n $';n !.nc i.n <=> pr. . Fp, $,- !.nc i.n- 444444444446 void equation9%f!oat > f!oat > dou"!e *> dou"!e *&2 64 9a !.nc i.n ,R;a i.nB n, r,n:.i, pa- $, param= r,- (:.i$ $,:an )+ E99, r,S.i B !9.a , B a$r,--,- $, :aria)9,- $, Fp, $.;)9, c,- B a$r,--,- :.n p,rm, r, $'acc@$,r ,n 9,c ;r, , ,n @cri ;r, a;% :aria)9,p.in @,- 46 64 L.$, $; m.$;9, app,9an 46

void $ain%void& ' f!oat w>.2 dou"!e ,>-2 w:92 .:92 equation9%.>w>K,>K-&2 66 D. .n- 9'.p@ra ,;r K $,:an ( 64 $@!ini i.n $, 9a !.nc i.n ,R;a i.nB 46

5 ,

void equation9%f!oat .> f!oat -> dou"!e *pGodu!e> dou"!e *pAr#u$ent& ' *pG$odu!e:sqrt%.*.J-*-&2 66 9a :aria)9, -, r.;:an N 9'a$r,--, pTm.$;9, pp: -Rr (%4%&F4F) 66 9a :aria)9, -, r.;:an N 9'a$r,--, pArA;m,n pp: 9'arA;m,n if %.PI& *pAr#u$ent:atan%-/.&2 if %.QI& *pAr#u$ent:atan%-/.&Jpi2 64 aQ.; $, pi 46 if %.::I& ' if %-PI& *pAr#u$ent:pi/92

1*

if %-QI& *pAr#u$ent:-pi/92 if %-::I& *pAr#u$ent:I2 ( (

2!7! Lonction a,ant un tableau co$$e para$?tre d.entr#e et un para$?tre de retour


La :onction so$$e calcule la so99e des l9ents d'un ta,leau de f!oat :ournit en entre. &otons ?u'un ta,leau sera tou>ours :ournit a2ec le no9,re d'l9ents au?uel la :onction doit accder. 64444 $,c9ara i.n $';n !.nc i.n <=> pr. . Fp, $,- !.nc i.n- 444444444446 f!oat so$$e%int >const f!oat *&2 64 !.nc i.n -.mm, r, .;rn, ;n !9.a (param= r, $, r, .;r) , r,S.i 9a :a9,;r $';n in (param= r, $',n r@,) , ;n a)9,a; ,n ,n r@, (p.in ,;r -;r ;n, c.n- an ,)+ Pn pa--, Q;- , 9'a$r,--, $, )a-, $; a)9,a;# .n n, r,c.pi, pa- .; 9, a)9,a;# par c.n r, .n pr@ci-, R;, 9,- @9@m,n - $; a)9,a; n, $,:r.n paU r, m.$i!i@- $an- 9a !.nc i.n+46 64 L.$, $; m.$;9, app,9an <define Fai!!e 6 void $ain%void& ' f!oat ta"[Fai!!e 2 int /"S!e$ents2 f!oat w2 /"S!e$ents:L2 ta"[I :62 ta"[1 :M2 ta"[9 :5 w:so$$e%/"S!e$ents>ta"&2 66rapp,9 ( 46

a) ,-

9'a$r,--, $; ',r ,9,m,n # (& a)102)

64 $@!ini i.n $, 9a !.nc i.n -.mm, R;i a--;r, 9a -.mm, $,- n) ,9,m,n - $; a)9,a;46 f!oat so$$e%int n">const f!oat *pta"& 66 9, m. /c9,! const in ,r$i 9'@cri ;r, $an- 9, a)9,a; ' 66 $,c9ara i.n $,- :aria)9,- 9.ca9,- N 9a !.nc i.n# acc,--i)9,- $,p;i- 9a 66 !.nc i.n ;niR;,m,n f!oat va!:I2 int i2 for %i:I2iQn"2iJJ& va!:va!Jpta"[i 2 /* Q:P va!:va!J*%pta"Ji& */ return%va!&2 (

2!8! Lonction a,ant un tableau co$$e para$?tre d.entr#eIsortie


La :onction initia!isation assure la saisie d'un ta,leau de f!oat. L'adresse de ,ase du ta,leau et le no9,re

1(

d'l9ent H saisir sont :ournit en argu9ent. Les l9ents du ta,leau seront accessi,les en criture.

64 pr. . Fp, $, 9a !.nc i.n 46 void initia!isation%int > f!oat *& 64 L.$, $; m.$;9, app,9an <define tai!!e 6 void $ain%void& ' f!oat ta"[tai!!e 2 int n"e!e$ents2 f!oat w2 n"e!e$ents:L2 initia!isation%n"e!e$ents>ta"&2 66 9a !.nc i.n :a m.$i!i,r C ,9,m,n ( 64 L.$, $, 9a !.nc i.n 46 void initia!isation%int n> f!oat *pta"& 64 V,S.i 9'a$r,--, $; a)9,a; pa--, ,n arA;m,n # n pr,ci-, 9, n.m)r, $'@9@m,n - $; a)9,a;46 ' int i2 for %i:I2iQn2iJJ& ' printf%)Dn Sntre, !a va!eur de ta"[Od :)>i&2 ff!ush%stdin&2 scanf%)Of)>Kpta"[i &2 64 .; a9.r- -can!("%!"#p a)&i); 9, p.in ,;r p a) p,rm, 9'acc=- ,n @cri ;r, 46 ( ( 46

2!9! Lonction a,ant une (ariable structur#e co$$e para$?tre d.entr#eIsortie


La :onction saisie_individu assure la saisie d'une 2aria,le de t;$e Findividu It;$e strucutrJ.

<define !on#chaine 95 64 $@!in i.n $';n Fp, - r;c ;r@ 46

t-pedef struct ' char no$[!on#chaine 2 int a#e2 ( Findividu2 64 pr. . Fp, $, 9a !.nc i.n 46 64!.nc i.n R;i r,mp9i ;n, :aria)9, - r;c ;r@,# param= r, $',n r@,6-.r i, 46 void saisie_individu%Findividu *&2 66 9a - r;c ;r, -,ra m.$i!i@, .n pa--, 9'a$r,--,

11

64 L.$, $; m.$;9, app,9an

46

void $ain%void& ' Findividu Gon8onho$$e:'))>I(2 66 ini ia9i-@ a:,c ' cha?n, :i$, , saisie_individu%KGon8onho$$e&2 66 .n pa--, 9'a$r,--, ( 64 L.$, $, 9a !.nc i.n 46

aA, N 0

void saisie_individu%t_individu * pUn8onho$$e& 'int !on#ueur:I2 printf%) Son no$ X : )&2 64 -ai-i, $; champ n.m 46 ff!ush%stdin&2 f#ets%pUn8onho$$e-Pno$>!on#chaine>stdin&2 66 acc,- a; champ a:,c -P !on#ueur: str!en%pUn8onho$$e-Pno$&2 if %pUn8onho$$e-Pno$[!on#ueur-1 ::3Dn3& ' !on#ueur--2 pUn8onho$$e-Pno$[!on#ueur :3DI32 ( printf%)Dn Son a#e X : )&2 ff!ush%stdin&2 scanf%)Od)>K%pUn8onho$$e-Pa#e&&2 66 9'a$r,--, $; champ aA, (

2!:! Lonction a,ant une (ariable structur#e co$$e para$?tre d.entr#e


Dans ce cas il es $ossi,le de $asser la 2aleur de la structure Ireco$ie de la structure dans un $ara9Atre :or9el de la :onctionJ 9ais cette reco$ie $eut Ktre gour9ande, on $r:Are ici $asser un $ointeur sur constante ?ui $er9et uni?ue9ent l'accAs en lecture. La :onction affiche_individu assure l'a::ichage H l'cran d'une 2aria,le de t;$e Findividu It;$e structurJ.

<define !on#chaine 95 /* dfintion d3un t-pe structur */ t-pedef struct ' char no$[!on#chaine 2 int a#e2 ( Findividu2 /* protot-pe de !a fonction */ void affiche_individu%const Findividu * &2 64!.nc i.n R;i a!!ich, ;n, :aria)9, - r;c ;r@,# param= r, $',n r@,# pa--aA, par a$r,--, 9, m. c9,! const pr.hi), 9'acc=- ,n @cri ;r, 46 /* Code du $odu!e appe!ant */ void $ain%void& ' Findividu Gon8onho$$e:')Nuevara)>79(2

14

affiche_individu%KGon8onho$$e&2 66 .n pa--, 9'a$r,--, ( /* Code de !a fonction */ void affiche_individu%const Findividu * pUn8onho$$e& ' printf%) Son no$ : Os Dn)>pUn8onho$$e-Pno$&2 printf%) Son a#e : Od Dn)>pUn8onho$$e-Ppreno$&2 (

6! Dur#e de (ie des (ariables


Les 2aria,les 9ani$ules dans un $rogra99e C ne sont $as toutes traites de la 9K9e 9aniAre. 'n $articulier, elles n'ont $as toutes la 9K9e dure de vie. /n distingue deu- catgories de 2aria,les.

6!1! Les (ariables per$anentes @ou stati4uesA


8ne 2aria,le $er9anente occu$e un e9$lace9ent en 99oire ?ui reste le 9K9e durant toute l'e-cution du $rogra99e. Cet e9$lace9ent est allou une :ois $our toutes lors de la co9$ilation. La $artie de la 99oire contenant les 2aria,les $er9anentes est a$$ele segment de donnes. <ar d:aut, les 2aria,les $er9anentes sont initialises H zro $ar le co9$ilateur. 'lles sont caractrises $ar le 9ot!cle: static.

6!2! Les (ariables te$poraires


Les 2aria,les te9$oraires se 2oient allouer un e9$lace9ent en 99oire de :aDon d;na9i?ue lors de l'e-cution du $rogra99e. 'lles ne sont $as initialises $ar d:aut. Leur e9$lace9ent en 99oire est li,r $ar e-e9$le H la :in de l'e-cution d'une :onction secondaire. <ar d:aut, les 2aria,les te9$oraires sont situes dans la $artie de la 99oire a$$ele segment de pile. Dans ce cas, la 2aria,le est dite automati ue. Le s$ci:icateur de t;$e corres$ondant, auto, est rare9ent utilis $uis?u'il ne s'a$$li?ue ?u'au- 2aria,les te9$oraires ?ui sont auto9ati?ues $ar d:aut. 8ne 2aria,le te9$oraire $eut gale9ent Ktre $lace dans un registre de la 9achine. 8n registre est une zone 99oire sur la?uelle sont e::ectues les o$rations 9achine. 5l est donc ,eaucou$ $lus ra$ide d'accder H un registre ?u'H toute autre $artie de la 99oire. /n $eut de9ander au co9$ilateur de ranger une 2aria,le trAs utilise dans un registre, H l'aide de l'attri,ut de t;$e re#ister. Le no9,re de registres tant li9it, cette re?uKte ne sera satis:aite ?ue s'il reste des registres dis$oni,les. Cette techni?ue $er9ettant d'acclrer les $rogra99es a au>ourd'hui $erdu tout son intrKt. )rGce au- $er:or9ances des o$ti9iseurs de code intgrs au co9$ilateur, il est 9aintenant $lus e::icace de co9$iler un $rogra99e a2ec une o$tion d'o$ti9isation ?ue de $lacer certaines 2aria,les dans des registres. La dure de 2ie des 2aria,les est lie H leur porte, c'est!H!dire H la $ortion du $rogra99e dans la?uelle elles sont d:inies.

6!6! Mariables globales


/n a$$elle variable globale une 2aria,le dclare en dehors de toute :onction. 8ne 2aria,le glo,ale est connue du co9$ilateur dans toute la $ortion de code ?ui suit sa dclaration. Les 2aria,les glo,ales sont s;st9ati?ue9ent $er9anentes. Dans le $rogra99e sui2ant, n'est une 2aria,le glo,ale %

13

int n2 void fonction%&2 void fonction%& ' nJJ2 printf%)appe! nu$ero OdDn)>n&2 return2 ( $ain%& ' int i2 for %i : I2 i QL2 iJJ& fonction%&2 ( ;a varia"!e n est initia!ise 4 ,ro par !e co$pi!ateur et i! s3a#it d3une varia"!e per$anente. Sn effet> !e pro#ra$$e affiche appe! nu$ero 1 appe! nu$ero 9 appe! nu$ero L

6!7! Mariables locales


/n a$$elle variable locale une 2aria,le dclare H l'intrieur d'une :onction Iou d'un ,loc d'instructionsJ du $rogra99e. <ar d:aut, les 2aria,les locales sont te9$oraires. Uuand une :onction est a$$ele, elle $lace ses 2aria,les locales dans la $ile. la sortie de la :onction, les 2aria,les locales sont d$iles et donc $erdues. Les 2aria,les locales n'ont en $articulier aucun lien a2ec des 2aria,les glo,ales de 9K9e no9. <ar e-e9$le, le $rogra99e sui2ant int n : 1I2 void fonction%&2 void fonction%& ' int n : I2 nJJ2 printf%)appe! nu$ero OdDn)>n&2 return2 ( $ain%& ' int i2 for %i : I2 i Q 62 iJJ& fonction%&2 (

a::iche appe! nu$ero 1 appe! nu$ero 1 appe! nu$ero 1

1.

Les 2aria,les locales H une :onction ont une dure de 2ie li9ite H une seule e-cution de cette :onction. Leurs 2aleurs ne sont $as conser2es d'un a$$el au sui2ant. 5l est toute:ois $ossi,le de crer une 2aria,le locale de classe stati?ue en :aisant $rcder sa dclaration du 9ot!cle: static % static type nom.de.variable2 8ne telle 2aria,le reste locale H la :onction dans la?uelle elle est dclare, 9ais sa 2aleur est conser2e d'un a$$el au sui2ant. 'lle est gale9ent initialise H zro H la co9$ilation. <ar e-e9$le, dans le $rogra99e sui2ant, n est une 2aria,le locale H la :onction secondaire fonction, 9ais de classe stati?ue. int n : 1I2 void fonction%&2 void fonction%& ' static int n2 nJJ2 printf%)appe! nu$ero OdDn)>n&2 return2 ( $ain%& ' int i2 for %i : I2 i QL2 iJJ& fonction%&2 ( Ce $rogra99e a::iche appe! nu$ero 1 appe! nu$ero 9 appe! nu$ero L /n 2oit ?ue la 2aria,le locale n est de classe stati?ue Ielle est initialise H zro, et sa 2aleur est conser2e d'un a$$el H l'autre de la :onctionJ. <ar contre, il s'agit ,ien d'une 2aria,le locale, ?ui n'a aucun lien a2ec la 2aria,le glo,ale du 9K9e no9.

7! Les para$?tres de la &onction $ain


Le $rotot;$e de la :onction 9ain $eut Ktre sous la :or9e % int $ain % void&2 // pas de para$Ytres for$e!s int $ain % int ar#c> char **ar#v&2 // avec para$Ytres for$e!s Dans les deu- cas le $ara9Atre de retour est un entier dont la 2aleur est trans9ise H l'en2ironne9ent d'e-cution. Cet entier indi?ue si le $rogra99e s'est ou non droul sans erreur. La 2aleur de retour 0 corres$ond H une ter9inaison correcte, toute 2aleur de retour non nulle corres$ond H une ter9inaison sur une erreur. De 9aniAre o$tionnel la :onction $eut accueillir des $ara9Atres :or9els % n"_ar# : ar#[I : ar#[i : corres$ond au no9,re d'argu9ents reDus, cha@ne de caractAres ?ui co9$rend le che9in et le no9 du logiciel, cha@ne de caractAres co9$renant les $ara9Atres.

Le $rogra99e ci!dessous $rsente un e-e9$le d'e-cution %

1=

<inc!ude Qstdio.hP int $ain%int n"_ar#> char **ar#& ' int i2 64 a!!ichaA, $,- arA;m,n - $; m.$;9, main46 for %i:I2iQn"_ar#2iJJ& return I2 ( '-ecution % De$uis une ligne de co99ande on entre % Pe.e$p9I Nuevara Castro A!!ende et on o,tient % ar#[I ar#[1 ar#[9 ar#[L :d:Dcours_cDe.e$p9I.e.e : Nuevara : Castro : A!!ende printf%) ar#[Od : Os Dn)> i>ar#[i &2 46

64 c, pr.Aramm, r,n:.i, ;n 0# a; -F- ,m, app,9an

la $re9iAre cha@ne corres$ond au no9 de l'e-cuta,le et H sa localisation sur le dis?ue dur Iici e.e$p9I.e.e ?ui se trou2e sur le dis?ue d: dans le r$ertoire d:Dcours_cJ.

8! 'ointeur sur une &onction


5l est $ar:ois utile de $asser une :onction co99e $ara9Atre d'une autre :onction. Cette $rocdure $er9et en $articulier d'utiliser une 9K9e :onction $our di::rents usages I2oir la :onction qsort%&J. <our cela, on utilise un 9canis9e de $ointeur. 8n $ointeur sur une :onction corres$ond H l'adresse du d,ut du code de la :onction. 8n $ointeur sur une :onction a;ant $our $rotot;$e t-pe fonction%type)(>...>type)n&2 est de t;$e type %*&%type)(>...>type)n&2 Dans l'e-e9$le ci!dessous on 9ontre co99ent utiliser cette :onctionnalit % <inc!ude Qstdio.hP 64 $,c9ara i.n $';n Fp, !.nc i.n r,c,:an B !9.a r, .;rnan ' !9.a 46

t-pedef f!oat Ffonction%f!oat>f!oat&2 6444 Er. . Fp, $,- !.nc i.nf!oat so$$e%f!oat > f!oat &2 4444444444444444444444444444444444444444444446

1B

f!oat produit%f!oat >f!oat &2 f!oat division%f!oat > f!oat &2 f!oat operation%f!oat > f!oat > Ffonction &2 void $ain%void& ' f!oat a>">c2 int choi.:I2 fonction *f2 66 9, $,rni,r param= r, !.rm,9 66 ,- $, Fp, !.nc i.n

64 ! p.in ,;r -;r ;n, !.nc i.n 46

do' printf%)* F-pe d3operation choisi : 1. so$$e aJ" Dn)&2 printf%)* 9. produit a*" Dn)&2 printf%)* L. division a/" Dn)&2 printf%)* I. fin du pro#ra$$e Dn)&2 printf%)* Sntre, votre choi. : )&2 ff!ush%stdin&2 scanf%)Od)>Kchoi.&2 printf%)Saisie de a : )&2 ff!ush%stdin&2 scanf%) Of)>Ka&2 printf%)Saisie de " : )&2 ff!ush%stdin&2 scanf%) Of)>K"&2 switch%choi.& ' case 1: f:Kso$$e2 64 ! pp: 9'a$r,--, $, 9a !.nc i.n -.mm, 46 "rea+2 case 9: f:Kproduit2 64 ! pp: 9'a$r,--, $, 9a !.nc i.n pr.$;i 46 "rea+2 case L: f:division2 64 9, n.m $';n, !.nc i.n ,- -.n a$r,--, $i:i-i.n <=>&$i:i-i.n46 "rea+2 defau!t : "rea+2 ( if %IQchoi.KKchoi.Q7& ' c:f%a>"&2 printf%) resu!tat : O9.9f > appu-er sur Sntree pour continuer...)>c&2 ff!ush%stdin&2 #etchar%&2 ( ( whi!e %choi.R:I&2

64 .n p,;

!air, pa--,r ;n, !.nc i.n ,n param= r, 46

c:operation%a>">division&2 64 $i:i-i.n ,- pa--,, ,n param, r, 46 printf%) resu!tat de !a division : O9.9f Dn)>c&2 f:Kproduit2 c:operation%a>">f&2 64 ! ,- pa--,, ,n param= r, 46 printf%) resu!tat de !a $u!tip!ication : O9.9f Dn)>c&2 ( f!oat so$$e%f!oat .> f!oat -& 'return%.J-&2(

40

f!oat produit%f!oat .>f!oat -& 'return%.*-&2( f!oat division%f!oat .> f!oat -& ' if %-::I& ' if %.R:I& 'printf%)division par ,ero i$possi"!eDn)&2 e.it%1&2 ( e!se return%1&2 ( e!se return%./-&2 (

f!oat operation%f!oat .> f!oat -> fonction /o$;oca!Zonction& ' return%/o$;oca!Zonction%.>-&&2 ( 64 D.mL.ca9W.nc i.n ,- ;n p.in ,;r# p;i-R;, 9, n.m $, 9a !.nc i.n ,param= r, , R;, 9, n.m $';n, !.nc i.n ,- -.n a$r,--, 33444446 pa--@ ,n

9! Lonctions a(ec un no$bre (ariable de para$?tres


5l est $ossi,le en C de d:inir des :onctions ?ui ont un no9,re 2aria,le de $ara9Atres. 'n $rati?ue, il e-iste sou2ent des 9thodes $lus si9$les $our grer ce t;$e de $ro,lA9e % toute:ois, cette :onctionnalit est indis$ensa,le dans certains cas, nota99ent $our les :onctions printf et scanf. 8ne :onction $ossdant un no9,re 2aria,le de $ara9Atre doit $ossder au 9oins un $ara9Atre :or9el :i-e. La notation !!! Io,ligatoire9ent H la :in de la liste des $ara9Atres d'une :onctionJ s$ci:ie ?ue la :onction $ossAde un no9,re ?uelcon?ue de $ara9Atres I2entuelle9ent de t;$es di::rentsJ en $lus des $ara9Atres :or9els :i-es. insi, une :onction a;ant $our $rotot;$e int f%int a> char c> ...&2 $rend co99e $ara9Atre un entier, un caractAre et un no9,re ?uelcon?ue d'autres $ara9Atres. De 9K9e le $rotot;$e de la :onction printf est int printf%char *for$at> ...&2 $uis?ue printf a $our argu9ent une cha@ne de caractAres s$ci:iant le :or9at des donnes H i9$ri9er, et un no9,re ?uelcon?ue d'autres argu9ents ?ui $eu2ent Ktre de t;$es di::rents. 8n a$$el H une :onction a;ant un no9,re 2aria,le de $ara9Atres s'e::ectue co99e un a$$el H n'i9$orte ?uelle autre :onction. <our accder H la liste des $ara9Atres de l'a$$el, on utilise les 9acros d:inies dans le :ichier en!tKte stdar#.h de la li,rairie standard. 5l :aut tout d'a,ord dclarer dans le cor$s de la :onction une 2aria,le $ointant sur la liste des $ara9Atres de l'a$$el Y cette 2aria,le a $our t;$e va_!ist. <ar e-e9$le, va_!ist !iste_para$etres2 Cette 2aria,le est tout d'a,ord initialise H l'aide de la 9acro va_star , dont la s;nta-e est va_start%!iste_para$etres> dernier_para$etre&2

oL dernier_para$etre dsigne l'identi:icateur du dernier $ara9Atre :or9el :i-e de la :onction. $rAs traite9ent
des $ara9Atres, on li,Are la liste H l'aide de la va_end % va_end%!iste_para$etres&2

4#

/n accAde au- di::rents $ara9Atres de liste $ar la 9acro va_ar# ?ui retourne le $ara9Atre sui2ant de la liste% va_ar#%!iste_para$etres> t-pe& oL t-pe est le t;$e su$$os du $ara9Atre au?uel on accAde. &otons ?ue l'utilisateur doit lui!9K9e grer le no9,re de $ara9Atres de la liste. <our cela, on utilise gnrale9ent un $ara9Atre :or9el ?ui corres$ond au no9,re de $ara9Atres de la liste, ou une 2aleur $articuliAre ?ui indi?ue la :in de la liste. Cette 9thode est utilise dans le $rogra99e sui2ant, oL la :onction afficha#e e::ectue l'a::ichage des cha@nes $asses en argu9ent en no9,re ?uelcon?ue.

<inc!ude Qstdio.hP <inc!ude Qstdar#.hP <define !on#ueur U

64 p.;r 9a A,- i.n $,- param, r,- 46

64 Er. . Fp, $';n, !.nc i.n r,c,:an $,- param= r,- ,n n.m)r, inc.nn;#++ 46 64 n) c.rr,-p.n$ a c, n.m)r, $, param= r,- 46 void afficha#e%int n">...&2 void $ain%void& ' afficha#e%L>)Che)>)Zide!)>)Sa!vador)&2 afficha#e%9>)Nu-)>)S$i!e)&2 ( void afficha#e%int n">...& 64 !.nc i.n a!!ichan 9,- chain,- pa--,,- ,n param, r, 46 ' int status>i>?2 char *ch2 64 p.in ,;r -;r ;n, -;i , $, carac ,r,- 46 char no$[!on#ueur 2 va_!ist pointe2 64 p.in ,;r -;r ;n, -;i , $, carac ,r,- 46 644444 :a_9iFp, pr,$,!ini $an- - $arA+h 8 Fp,$,! char 4:a_9i444446

va_start%pointe>n"&2 64444 :a_- ar r,n:.i, $an- p.in , ($, Fp, :a_9i- ,) 9'a$r,--, $, 9',9,m,n -;i:an n) pa--, ,n arA;m,n 46 for %i:I2iQn"2iJJ& ' ch:va_ar#%pointe>char *&2 64 ch pp: 9'a$r,--, $, 9a chain, $, carac ,r,- a 9'a$r,--, p.in , , 9'a$r,--, $; param, r, -;i:an 46

p.in , pp:

64 .n r,c.pi, 9a chain, $,); an ,n ch $an- n.m# .n n, c.nnai pa- a pri.ri 9a ai99, $, ch .n n, p,; $.nc ; i9i-,r - rcpF() 46 ?:I2 do ' no$[? :ch[? 2 ?JJ2 ( whi!e%ch[? R:3DI3 KK ?Q%!on#ueur-1&&2 66 n.m12 ,- $, 9.nA;,;r X no$[? :3DI32 // on a?oute !e caractere de fin de chaine

4*

printf%) afficha#e des para$etres : Os Dn)>no$&2 ( /* pour !e for */ va_end%pointe&2 64 r,n$ 9a m,m.ir, ,:,n ;,99,m,n ( 64 p.;r 9a !.nc i.n 46 r,-,r:,, par :a_- ar 46

::ichage cran rsultant % afficha#e afficha#e afficha#e afficha#e afficha#e des des des des des para$etres para$etres para$etres para$etres para$etres : : : : : Che Zide! Sa!vador NuS$i!e

4(

Chapitre 9 : Les Lichiers

5l est $ossi,le de lire et d'crire des donnes dans un :ichier. <our des raisons d'e::icacit, les accAs H un :ichier se :ont $ar l'inter9diaire d'une 99oire!ta9$on Ibu''erJ, ce ?ui $er9et de rduire le no9,re d'accAs au$ri$hri?ues Idis?ue...J. <our $ou2oir 9ani$uler un :ichier, un $rogra99e a ,esoin d'un certain no9,re d'in:or9ations % l'adresse de l'endroit de la 99oire!ta9$on oL se trou2e le :ichier, la $osition de la tKte de lecture, le 9ode d'accAs au :ichier Ilecture ou critureJ ... Ces in:or9ations sont rasse9,les dans une structure dont le t;$e, ZC;S *, est d:ini dans stdio.h. 8n o,>et de t;$e ZC;S * est a$$el flot de donnes Ien anglais, strea9J. 2ant de lire ou d'crire dans un :ichier, on noti:ie son accAs $ar la co99ande fopen. Cette :onction $rend co99e argu9ent le no9 du :ichier, ngocie a2ec le s;stA9e d'e-$loitation et initialise un :lot de donnes, ?ui sera ensuite utilis lors de l'criture ou de la lecture. $rAs les traite9ents, on annule la liaison entre le :ichier et le :lot de donnes grGce H la :onction fc!ose!

1! La &onction fopen
_rotot-pe dans Qstdio.hP ZC;S * fopen % const char * 'ilename> const char * mode &2 Cette :onction, de t;$e ZC;S* ou2re un :ichier et lui associe un :lot de donnes. La 2aleur retourne $ar fopen est un :lot de donnes. Si l'e-cution de cette :onction ne se droule $as nor9ale9ent, la 2aleur retourne est le $ointeur /U;;. 5l est donc reco99and de tou>ours tester si la 2aleur ren2o;e $ar la :onction fopen est gale H /U;; a:in de dtecter les erreurs Ilecture d'un :ichier ine-istant...J. 'ilename est le no9 du :ichier concern, :ourni sous :or9e d'une cha@ne de caractAres. mode, est une cha@ne de caractAres ?ui s$ci:ie le 9ode d'accAs au :ichier. Les 9odes d'accAs di::Arent sui2ant le t;$e de :ichier considr. /n distingue

les fichiers textes, $our les?uels les caractAres de contr6le Iretour H la ligne ...J seront inter$rts en tant ?ue tels lors de la lecture et de l'criture Y les fichiers binaires, $our les?uels les caractAres de contr6le se sont $as inter$rts.

Les di::rents 9odes d'accAs sont les sui2ants % )r) )w) )a) )r") )w") )a") )rJ) )wJ) )aJ) ou2erture d'un :ichier te-te en lecture ou2erture d'un :ichier te-te en criture ou2erture d'un :ichier te-te en criture H la :in ou2erture d'un :ichier ,inaire en lecture ou2erture d'un :ichier ,inaire en criture ou2erture d'un :ichier ,inaire en criture H la :in ou2erture d'un :ichier te-te en lectureTcriture ou2erture d'un :ichier te-te en lectureTcriture ou2erture d'un :ichier te-te en lectureTcriture H la :in

)rJ") ou2erture d'un :ichier ,inaire en lectureTcriture )wJ") ou2erture d'un :ichier ,inaire en lectureTcriture )aJ") ou2erture d'un :ichier ,inaire en lectureTcriture H la :in

41

Ces 9odes d'accAs ont $our $articularits % Si le 9ode contient la lettre r, le :ichier doit e-ister. Si le 9ode contient la lettre w, le :ichier $eut ne $as e-ister. Dans ce cas, il sera cr. Si le :ichier e-iste d>H, son ancien contenu sera $erdu. Si le 9ode contient la lettre a, le :ichier $eut ne $as e-ister. Dans ce cas, il sera cr. Si le :ichier e-iste d>H, les nou2elles donnes seront a>outes H la :in du :ichier $rcdent. +rois :lots standard $eu2ent Ktre utiliss en C sans ?u'il soit ncessaire de les ou2rir ou de les :er9er % stdin Istandard in$utJ % unit d'entre I$ar d:aut, le cla2ierJ Y stdout Istandard out$utJ % unit de sortie I$ar d:aut, l'cranJ Y stderr Istandard errorJ % unit d'a::ichage des 9essages d'erreur I$ar d:aut, l'cranJ.

2! La &onction fc!ose
_rotot-pe dans Qstdio.hP int fc!ose % ZC;S * strea$ &2

stream est le :lot de t;$e ZC;S* retourn $ar la :onction fopen corres$ondant. La :onction fc!ose retourne un entier ?ui 2aut zro si l'o$ration s'est droule nor9ale9ent Iet une 2aleur non nulle en cas d'erreurJ.

6! La &onction fread
_rotot-pe dans Qstdio.hP si,e_t fread%void *ptr> si,e_t si*e> si,e_t n> ZC;S *stream&2 Lit un ta,leau de n l9ents , a;ant chacun une taille de si*e octets, de$uis ,;tes le :lu- stream et stocCe ces l9ents H l'adresse s$ci:ie $ar ptr. Le $ointeur de :ichier stream est ensuite a2anc du no9,re d'octest lus ?ui en cas de succAs est gal H Isi*e * nJ. Retourne le no9,re d'l9ents lus, si cette 2aleur est di::rente de n, soit une erreur de lecture est sur2enue soit le :in du :ichier est atteinte.

7! La &onction fwrite
_rotot-pe dans Qstdio.hP

si,e_t fwrite%const void * ptr> si,e_t si*e> si,e_t n> ZC;S * stream&2
'crit un ta,leau de n l9ents, chacun d'une taille de si*e octets, de$uis l'adresse $ointe $ar ptr 2ers la $osition courante du :lu- stream. Le :lu- est a2anc du no9,re total d'octets crits ?ui est gal H Isi*e + countJ. Retourne le no9,re d'l9ents e::ecti2e9ent crits, s'il di::Are de n, cela indi?ue une erreur d'criture.

8! La &onction feof
_rotot-pe dans Qstdio.hP int feof% ZC;S * stream&2 Vri:ie si l'indicateur de :in de :ichier associ au :lu- stream est acti:. 'lle retourne une 2aleur di::rent de 0 le cas

44

chant.

9! La &onction fsee+
_rotot-pe dans Qstdio.hP int fsee+ % ZC;S * stream> !on# int o''set> int ori(in&2 <lace le $ointeur de :ichier stream H une nou2elle $osition d:inie en a>outant o''set H une $osition de r:rence s$ci:ie $ar ori(in. 'lle retourne 0 en cas de succAs et di::rent de 0 en cas d'chec. <our les :lu- ou2erts en lectureTcriture l'a$$el H la :onction fsee+ $er9et de $asser d'un 9ode H l'autre. ori(in $eut $rendre les 2aleurs sui2antes % S''KcS'+ S''KcC8R S''Kc'&D D,ut du :ichier <osition courante du $ointeur de :ichier "in du :ichier

:! La &onction fte!!
_rotot-pe dans Qstdio.hP !on# int fte!! % ZC;S * stream&2 Retourne la 2aleur courante du $ointeur de :ichier stream. <our les :ichiers ,inaires la 2aleur retourne corres$ond au no9,re d'octets de$uis le d,ut du :ichier. <our les :ichiers te-te, la 2aleur n'est $as :orc9ent l'e-act no9,re d'octets de$uis le d,ut du :ichier, 9ais cette 2aleur $eut Ktre utilise $our indi?uer une $osition H la :onction 'seek. 'n cas de succAs la $osition courante est retourne.

8! La &onction rewind
_rotot-pe dans Qstdio.hP void rewind%ZC;S * stream&2 <lace le $ointeur en d,ut de :ichier. 8n a$$el H rewind est ?ui2alent H fsee+%strea$>I>SSSa_SSF&2 <our les :lu- ou2erts en lectureTcriture l'a$$el H la :onction rewind $er9et de $asser d'un 9ode H l'autre.

9! La &onction fprintf
_rotot-pe dans Qstdio.hP int fprintf % ZC;S * stream> const char * 'ormat> ... &2 'crit dans stream des donnes :or9ates tel ?ue s$ci:i dans le $ara9Atre 'ormat. Retourne le no9,re de caractAres crits en cas de succAs, et !# en cas d'erreur. Les :or9ats ad9is corres$ondent H ceu- de la :onction printf.

10! /e$ple charge$ent d.un &ichier en $#$oire


<inc!ude Qstdio.hP <inc!ude Qstd!i".hP

43

int $ain %void& ' ZC;S * pZi!e2 !on# !Si,e2 char * "uffer2 si,e_t resu!t2 pZi!e : fopen % )!eno$dufichier."in) > )r") &2 if %pZi!e::/U;;& 'printf%)Srreur !ors de !3ouverture.Dn)&2 e.it %1&2( 66 D@ ,rmina i.n $, 9a ai99, $; !ichi,r fsee+ %pZi!e > I > SSSa_S/[&2 66 .n -, p9ac, N 9a !in !Si,e : fte!! %pZi!e&2 66 .n r@c;p=r, 9a ai99, rewind %pZi!e&2 66 .n r,:i,n a; $@); 66 a99.ca i.n m@m.ir, p.;r - .c>,r 9',n-,m)9, $; !ichi,r "uffer : %char*& $a!!oc %si,eof%char&*!Si,e&2 if %"uffer :: /U;;& 'printf%)Srreur d3a!!ocation $e$oire)&2 e.it %9&2( 66 c.pi, $; !ichi,r $an- 9, );!!,r resu!t : fread %"uffer>1>!Si,e>pZi!e&2 if %resu!tR:!Si,e& 'printf%)Srreur de !ecture)&2 e.it %L&2( 64 9',n-,m)9, $; !ichi,r ,main ,nan charA@ ,n m@m.ir,+ 46

66 .n !,rm, 9, !ichi,r fc!ose %pZi!e&2 free %"uffer&2 66 .n r,n$ 9a m,m.ir, a99.;,, return I2

11! /e$ple Lecture et e/traction de lignes d.un &ichier te/te

/* Ouverture d3un fichier te.te char#e$ent en $$oire puis e.traction !i#ne par !i#ne 4 !3aide de strto+ */ <inc!ude Qstdio.hP <inc!ude Qstd!i".hP <inc!ude Qstrin#.hP

int $ain%void& ' !on# tai!!e:I2 char * pChaine:/U;;2 ZC;S * pZichier2 char * p:/U;;2 66 LharA,m,n $';n !ichi,r ,% , $an- ;n a)9,a; $, carac =r,-

pZichier:fopen%)!eno$.t.t)>)r")&2 if %pZichier::/U;;& ' printf%)Srreur !ors de !3ouverture du fichier Dn)&2

4.

e.it%1&2 ( fsee+%pZichier>I>SSSa_S/[&2 tai!!e:fte!!%pZichier&2 66 .n r@c;p=r, 9a rewind%pZichier&2 66 .n r,:i,n a; $@); ai99, $; !ichi,r

pChaine:%char *& rea!!oc%/U;;>tai!!e*si,eof%char&&2 if %pChaine::/U;;& ' printf%)Srreur A!!ocation ta"!eau pChaine Dn)&2 e.it%9&2 ( fread%pChaine>tai!!e>1>pZichier&2 fc!ose%pZichier&2 66 ,% rac i.n $,- 9iAn,- ;n, N ;n, p:strto+%pChaine>)Dn)&2 66 p p.in , -;r 9, $@); $, 9iAn,+

whi!e%pR:/U;;& ' printf%)OsDn)>p&2 66 a!!ichaA, $, 9a 9iAn, p:strto+%/U;;>)Dn)&2 66 .n pa--, N 9a -;i:an , ( free%pChaine&2 (

4=

Chapitre : : Allocation D,na$i4ue

La connaissance a $riori de la taille des ta,leau- et des donnes ncessaires H l'e-cution d'un $rogra99e n'est $as tou>ours $ossi,le. <our $er9ettre la cration de donnes en :onction du ,esoin il e-iste des instructions ?ui $er9ettent d'allouer de la 99oire au $rogra99e.

1! Allocation si$ple $a!!oc


_rotot-pe std!i".h void * $a!!oc % si,e_t si,e &2 lloue un ,loc de si*e octets de 99oire, et retourne un $ointeur de t;$e void * indi?uant l'adresse de d,ut du ,loc. Le contenu du ,loc 99oire est indter9in. 'n cas d'echec le $ointeur retourn 2aut /U;;. /e$ple allocation d.un tableau de f!oat int $ain%void& ' f!oat * ta":/U;;2 int tai!!e:I2 printf%) tai!!e du ta"!eau dsir X)& ff!ush%stdin&2 scanf%)Od)>Ktai!!e&2 ta":%f!oat & $a!!oc%si,eof%f!oat&*tai!!e&2 if %ta"::/U;;& ' ( for %i:I2iQtai!!e&2iJJ& ' ta"[i :i*1I2 ( for %i:I2iQtai!!e&2iJJ& printf%)Of Dn)>ta"[i &2 free%ta"&2 ( printf%) Schec a!!ocation)&2 e.it%1&2

2! Allocation $ultiple rea!!oc


_rotot-pe std!i".h

4B

void * rea!!oc % void * ptr> si,e_t si*e&2 Ralloue de la 99oire. La taille du ,loc 99oire $oint $ar ptr est redi9ensionn H si*e octets, aug9entant ou rduisant la ,loc e-istant. Si ,esoin la :onction d$lace le ,loc 2ers un nou2el e9$lace9ent. Le $ara9Atre de retour corres$ond H l'adresse de ,ase du nou2eau ,loc I$ointeur de t;$e void +J. Le contenu du ,loc 99oire est 9aintenu. Si la nou2elle taille si*e est su$rieure H l'ancienne, la 2aleur du nou2eau ,loc est indter9ine. Si ptr 2aut /U;;, la :onction se co9$orte co99e la :onction $a!!oc. Si si*e 2aut 0, la 99oire $rcde99ent alloue est rendue, la :onction se co9$orte alors co99e free. 'n cas d'chec le $ointeur /U;; est retourn. /e$ple utilisation de rea!!oc : <inc!ude Qstdio.hP <inc!ude Qstd!i".hP void $ain%void& ' f!oat *vect:/U;;2 int i>?>+>n"2 +:L2 // reservation de + !$ents vect:%f!oat *& rea!!oc%vect>+*si,eof%f!oat&&2 if %vect::/U;;& ' printf%) pro"!Y$e a!!ocation $e$oire Dn)&2 e.it%1&2 ( // on re$p!it !e ta"!eau for %?:I2?Q+2?JJ& vect[? :?2 /* pointeur sur une suite de re!s> initia!is 4 /U;; */ /* pour scanf> printf */ /* pour e.it> ca!!oc> $a!!oc> rea!!oc> free */

// on !3affiche printf%)1. adresse du ta"!eau : Op et adresse du pointeur vect Op Dn) >vect>Kvect&2 for %?:I2?Q+2?JJ& printf%)vect[Od :Of et son adresse Op Dn)> ?> vect[? > Kvect[? &2 // reservation de 9 e!e$ents supp!$entaires i:92 n":+Ji2 vect:%f!oat *& rea!!oc%vect>n"*si,eof%f!oat&&2 if %vect::/U;;& ' printf%) pro"!Y$e a!!ocation $e$oire Dn)&2 e.it%1&2 ( // on re$p!it !e ta"!eau for %?:+2?Qn"2?JJ& vect[? :?2

30

// on !3affiche printf%)9. adresse du ta"!eau : Op et adresse du pointeur vect Op Dn) >vect>Kvect&2 for %?:I2?Qn"2?JJ& printf%)vect[Od :Of et son adresse Op Dn)> ?> vect[? > Kvect[? &2 // on !i"Yre !3espace $$oire free%vect&2
}

AZZCCEANS SCRA/ '+ a$r,--, $; a)9,a; = :,c 102=0+000000 , -.n :,c 1'2='+000000 , -.n :,c 1B2=B+000000 , -.n B+ a$r,--, $; a)9,a; = :,c 102=0+000000 , -.n :,c 1'2='+000000 , -.n :,c 1B2=B+000000 , -.n :,c 1C2=C+000000 , -.n :,c 1<2=<+000000 , -.n UIZ9:III7 , a$r,--, $; p.in ,;r :,c a$r,--, UIZ9:III7 a$r,--, UIZ9:IIIM a$r,--, UIZ9:IIIC UIZL:III7 , a$r,--, $; p.in ,;r :,c a$r,--, UIZL:III7 a$r,--, UIZL:IIIM a$r,--, UIZL:IIIC a$r,--, UIZL:II1I a$r,--, UIZL:II17 MZ[I:IZZM

MZ[I:IZZM

/e$ple allocation d,na$i4ue de tableau 1 plusieurs di$ension :


<inc!ude Qstdio.hP <inc!ude Qstd!i".hP void $ain%void& ' int **ta"7:/U;;2 unsi#ned int i>?>+>n2 66 a)9,a; $.n 66 pri.ri .n iAn.r, 9, n.m)r, $, 9iAn,- EG 9, n.m)r, $, c.9.nn,- a // pour scanf> puts> printf // pour !3a!!ocation d-na$ique

printf%) [onne, !e no$"re de !i#nes du ta"!eau : )&2 ff!ush%stdin&2 scanf%)Ou)>K+&2 printf%) [onne, !e no$"re de co!onnes du ta"!eau:)&2 ff!ush%stdin&2 scanf%)Ou)>Kn&2 66 a99.ca i.n $FnamiR;, $';n 66 p.in an -;r $,- ,n i,rta"7:%int **& a)9,a; $, > p.in ,;r- p.in an -;r $,- p.in ,;r-

rea!!oc%ta"7>+*si,eof%int *&&2

if %ta"7::/U;;& 'printf%)Ge$oire insuffisante...)&2 e.it%1&2( 66 a99.ca i.n $FnamiR;, $'a; an $, a)9,a; $, n ,n i,r- R;'i9 F a $, 669iAn,# 9'a$r,--, ,- mi-, $an- a)<1i2 for %i:I2iQ+2iJJ&

3#

' ta"7[i :%int *& rea!!oc%/U;;>n*si,eof%int&&2 if %ta"7[i ::/U;;& 'printf%)Ge$oire insuffisante...)&2 e.it%9&2( ( 66 .n r,mp9i a)< for %i:I2iQ+2iJJ& for %?:I2?Qn2?JJ& ta"7[i [? :i*1IJ?2 66 .n r,n$ 9',-pac, m@m.ir, $,:,n; in; i9, 66 9,- )9.c- $',n i,rfor %i:I2iQ+2iJJ& free%ta"7[i &2 66 9, a)9,a; $, p.in ,;r-

free%ta"7&2 (

Ych@ma m@m.ir, $; a)9,a; N ai99, a pri.ri inc.nn;, 9, p.in ,;r a)< ,- $an- 9a pi9,# i9 p.in , -;r ;n a)9,a; $, p.in ,;r9,- @9@m,n - a)<1i2 R;i -.n $an- 9, GAY c.n i,nn,n 9'a$r,--, $,- $i!!@r,n ,- 9iAn,- $; a)9,a;# R;i -.n $,- )9.c- $',n i,r- ranA@$, mani=r, c.n iA;, $an- 9, GAY &///////////////////////////////& | a)<1'21B2 B .c , - ('B) | &///////////////////////////////Z | a)<1'21'2 B .c , - ('') | &///////////////////////////////Z | a)<1'2102 B .c , - ('0) | &///////////////////////////////Z | | ++++++++++++ &///////////////////////////////Z | a)<1021B2 B .c , - (0B) | &///////////////////////////////Z | a)<1021'2 B .c , - (0') | &///////////////////////////////Z | a)<102102 B .c , - (00) | &///////////////////////////////& | |

X0W<8000I X0W<8000J X0W<8000< = a)<1'2

X0WC8000I X0WC8000J X0WC8000< = a)<102

&///////////////////////////////& | a)<1'2 B .c , - (XW0<8000<) | &///////////////////////////////Z | a)<102 B .c , - (X0WC8000<) | &///////////////////////////////& X0WB8000<= | | ++++++++++++ &///////////////////////////////Z | a)< B .c , - (X0WB8000<) | &///////////////////////////////& IWD080WWJ

a)<

3*

Chapitre 8 : Listes ChaDn#es

3(

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