bauer peter - c programozas

of 299 /299
C programnyelv 1 1BEVEZETÉS.................................................................................................................... 5 2JELÖLÉSEK..................................................................................................................... 7 3ALAPISMERETEK..........................................................................................................8 3.1Forrásprogram............................................................................................................8 3.2Fordítás...................................................................................................................... 8 3.3Kapcsoló–szerkesztés (link).................................................................................... 12 3.4Futtatás..................................................................................................................... 12 3.5Táblázat készítése.................................................................................................... 13 3.6Bemenet, kimenet.................................................................................................... 21 3.7Tömbök.................................................................................................................... 28 3.8Függvények.............................................................................................................. 31 3.9Prodzsekt................................................................................................................. 35 3.10Karaktertömb és karakterlánc................................................................................ 37 3.11Lokális, globális és belső, külső változók.............................................................. 41 3.12Inicializálás............................................................................................................ 46 4TÍPUSOK ÉS KONSTANSOK...................................................................................... 49 4.1Elválasztó-jel........................................................................................................... 50 4.2Azonosító................................................................................................................. 51 4.3Típusok és konstansok a nyelvben........................................................................... 52 4.3.1Egész típusok és konstansok............................................................................. 55 4.3.2Felsorolás (enum) típus és konstans................................................................. 58 4.3.3Valós típusok és konstans................................................................................. 61 4.3.4Karakter típus és konstans................................................................................ 63 4.4Karakterlánc (string literal):.....................................................................................68 4.5Deklaráció ............................................................................................................... 71 4.5.1Elemi típusdefiníció (typedef).......................................................................... 75 5MŰVELETEK ÉS KIFEJEZÉSEK................................................................................ 77 5.1Aritmetikai műveletek (+, -, *, / és %)..................................................................... 79 5.1.1Multiplikatív operátorok (*, / és %)..................................................................80 5.1.2Additív operátorok (+ és -)............................................................................... 83 5.1.3Matematikai függvények................................................................................... 83 5.2Reláció operátorok ( >, >=, <, <=, == és !=)........................................................... 85 5.3Logikai műveletek ( !, && és ||)...............................................................................86 5.4Implicit típuskonverzió és egész–előléptetés........................................................... 87 5.5Típusmódosító szerkezet......................................................................................... 89 5.6sizeof operátor......................................................................................................... 90 5.7Inkrementálás (++), dekrementálás (--) és mellékhatás........................................... 91 5.8Bit szintű operátorok ( ~, <<, >>, &, ^ és |)............................................................. 92 5.9Feltételes kifejezés ( ? :).......................................................................................... 96 5.10Hozzárendelés operátorok..................................................................................... 98 5.11Hozzárendelési konverzió.................................................................................... 100 5.12Vessző operátor................................................................................................... 101 5.13Műveletek prioritása ........................................................................................... 102 6UTASÍTÁSOK............................................................................................................. 106 6.1Összetett utasítás.................................................................................................... 106 6.2Címkézett utasítás.................................................................................................. 107 6.3Kifejezés utasítás................................................................................................... 107 6.4Szelekciós utasítások............................................................................................. 108 6.5Iterációs utasítások................................................................................................. 111 6.6Ugró utasítások...................................................................................................... 116

Author: duditomi

Post on 02-Jul-2015

1.912 views

Category:

Documents


132 download

Embed Size (px)

TRANSCRIPT

C programnyelv 11BEVEZETS.................................................................................................................... 52JELLSEK.....................................................................................................................73ALAPISMERETEK..........................................................................................................83.1Forrsprogram............................................................................................................83.2Fordts...................................................................................................................... 83.3Kapcsolszerkeszts (link).................................................................................... 123.4Futtats.....................................................................................................................123.5Tblzat ksztse.................................................................................................... 133.6Bemenet, kimenet.................................................................................................... 213.7Tmbk....................................................................................................................283.8Fggvnyek.............................................................................................................. 313.9Prodzsekt................................................................................................................. 353.10Karaktertmb s karakterlnc................................................................................ 373.11Loklis, globlis s bels, kls vltozk..............................................................413.12Inicializls............................................................................................................ 464TPUSOK S KONSTANSOK......................................................................................494.1Elvlaszt-jel........................................................................................................... 504.2Azonost................................................................................................................. 514.3Tpusok s konstansok a nyelvben...........................................................................524.3.1Egsz tpusok s konstansok............................................................................. 554.3.2Felsorols (enum) tpus s konstans................................................................. 584.3.3Vals tpusok s konstans................................................................................. 614.3.4Karakter tpus s konstans................................................................................ 634.4Karakterlnc (string literal):.....................................................................................684.5Deklarci ...............................................................................................................714.5.1Elemi tpusdefinci (typedef).......................................................................... 755MVELETEK S KIFEJEZSEK................................................................................ 775.1Aritmetikai mveletek (+, -, *, / s %).....................................................................795.1.1Multiplikatv opertorok (*, / s %)..................................................................805.1.2Additv opertorok (+ s -)............................................................................... 835.1.3Matematikai fggvnyek...................................................................................835.2Relci opertorok ( >, >=, i), azaz a kifejezs struct B itagjt inkrementlja, s nem sptrt. Hamgis ezt szeretnnk (br a konkrt pldnl ennek semmi rtelmesincs), akkor a ++sptr kifejezs rszt zrjelbe kell tenni, azaz: (++sptr)->iA++(sptr++)->iugyancsak s.it inkrementlja, de a kifejezs mellkhatsaknt sptris megn eggyel. Ha a zrjeleket elhagyjuk, persze akkor is ideju-tunk: ++sptr++->i ++(sptr++)->i- Ugyangy a nev cmen lev karaktert ri el a *sptr->nev, hisz az indirekcit az elbbiekbl kvetkezleg azsptrrel elrtnev cmen hajtja vgre a fordt. Vegyk mg a *sptr++->nev++kifejezst, aminekugyanaz az rtke, mint az elz kifejezs, demellkhatsknt sptr s nev inkrementlsa is megtrtnik. 226 STRUKTRK S UNIKe Ha mr mindig hozzrendelsi pldkat hoztunk, akkor itt kell meg-emltennk, hogy struktrkat csak akkor lehet egymshoz rendelni, ha aforrs s a cl struktra azonos tpus. struct A {int i, j;double d; } a, a1;struct B {int i, j;double d; } b;/* . . . */a = a1; /* OK, a hozzrendels megy tagrl-tagra. */a = b; /* HIBS, mert eltr a kt struktra tpusa.*/a.i = b.i; /* Tagrl-tagra persze most is megy a dolog. */a.j = b.j;a.d = b.d;Vegynk valamilyen pldt a struktratmbkre! Keressk meg a megadott, skbeli pontok kzt a kt, egymstl legtvo-labbit! A pontok szma csak futs kzben dl el (n), de nem lehetnek tb-ben egy fordtsi idben vltoztathat rtknl (N). Az x koordinta bevi-telekor res sort megadva, a bemenet elbb is befejezhet, de legalbb ktpont elvrand! Az input ellenrzend, s minden hibs rtk helyett azon-nal jat kell krni. Az eredmny kzlsekor meg kell jelentetni a kt pontindexeit, koordintit s persze a tvolsgot is. /* PELDA28.C: A kt, egymstl legtvolabbi pont megkeresse. */#include #include #include #include #define INP 28 /* Az input puffer mrete. */#define N 128 /* Pontok maximlis szma. */A feladatot skbeli pontot ler struktra segtsgvel fogjuk megoldani: struct Pont{ /* A Pont struktra. */double x, y; };int getline(char s[],int n){ /* . . . */ }int lebege(char s[]){ /* . . . */ }A kt fggvny forrsszvege idemsoland! int main(void){char sor[INP+1]; /* Input puffer. */A struktratmb defincija: struct Pont p[N]; /* Struktratmb. */int n=0; /* Pontok szma. */double max=-1., d; /* Pillanatnyi maximum s */int i, j, tavi, tavj;/* segdvltozk. */C programnyelv 227printf("A kt egymstl legtvolabbi pont a skban.\n""Adja meg a pontok koordintaprjait rendre!\n""Vge: res sor az X koordinta megadsnl.\n\n");for(n=0; nev%4)&&pd->ev%100||(!pd->ev%400));if(pd->evev>9999 || pd->hoho>12 || pd->napnap>honap[pd->ho]){pd->evnap=0; pd->datumssz=0l; return 0;}else {sprintf(pd->datumlanc, "%04d.%02d.%02d",pd->ev, pd->ho, pd->nap);pd->evnap=pd->nap;for(i=1; iho; ++i)pd->evnap+=honap[i];pd->datumssz=(pd->ev-1)*365l+pd->evnap+pd->ev/4-pd->ev/100+pd->ev/400; return 1; } }C programnyelv 231A Datume ugyangy a dtumot ellenrzi, s logikai vlaszt ad a form-lisan je a dtum? krdsre, mint a korbbi datumefggvnyek. Nemkarakterlncbl dolgozik azonban, hanem a struktra ev,ho,naptagjai-bl, melyeket a DatumEHN, ill. a DatumKAR ksztettek oda. Ha hibsa dtum, akkor nullzza a rutin az evnap s a datumssz tagokat. Ha j a dtum, akkor a Datume kpezi a datumlancba a dtum karak-terlnc alakjt, s meghatrozza az evnap s a datumssz rtkt. Az evnapa dtum napszmrl indul, s a rutin hozzadogatja a megelz hnapokmaximlis napszmait. Adtumsorszmmegllaptshoz a szkvvizsglathoz hasznlatos kifejezst alkalmazza a fggvny. Az STDIO.H bekapcsolsval rendelkezsre ll sprintf ugyangymkdik, mint printf trsa, de nem a szabvny kimenetre, hanem az elsparamtereknt kapott karaktertmbbe dolgozik. A formtumspecifikcikban a mezszlessg eltt ll 0 hatsra ajobbra igaztott szmok balrl nem szkz, hanem 0 feltltst kapnak.Magyarn a 932.2.3. dtumbl 0900.02.03 karakterlnc lesz. Szltunk mr rla, hogy a Datume nem hvhat ms forrsmodulbl. ADATUM.Cben is csak a DatumEHN s a DatumKAR idzi meg utolslpseknt. int DatumEHN(int e, int h, int n, struct datum *pd){pd->ev=e;pd->ho=h;pd->nap=n;if(e>=0&&h>=0&&n>=0&&eho=pd->nap=0;strncpy(pd->datumlanc, lanc, 10);pd->datumlanc[10] = 0;pd->ev=atoi(lanc);while(isdigit(*lanc))++lanc;if(*lanc!=0){++lanc;pd->ho=atoi(lanc);while(isdigit(*lanc))++lanc;if(*lanc){++lanc;pd->nap=atoi(lanc);}}return Datume(pd); }A DatumEHNa kapott,inttpus v, h, nap segtsgvel tlti fel azutols paramterknt elrt dtum struktrt. 232 STRUKTRK S UNIKAz sprintf hvs eltti vizsglatra azrt van szksg, hogy a rutin netudja tlrni a 11 elem karaktertmb, datumlanc tagot a memriban va-lamilyenegszenzldsgv, h, napparamter miatt. Ilyenkorreslesz a datumlanc. A DatumKARtmsolja a karakterlnc alakban kapott dtum els 10karaktert a datumlancba. Nullzza a honapot s napot. Ltszik, hogy afggvny nem kti meg olyan szigoran sem az v, sem a hnap s napjegyszmt, mint a korbbi datume, ill. elvlaszt karakterknt csak vala-milyennemnumerikustvr el.Akarakterlncegssz konvertltelejtvnek, az els elvlaszt karakter utni rszt hnapnak, s a msodik elv-laszt karakter mgttieket napnak tekinti a rutin, hacsak idkzben vgenem lesz a karakterlncnak. Vgl mindkt fggvny meghvja a Datumet, s ennek visszatrsi r-tkt szolgltatja. long DatumKul(struct datum *pd1, struct datum *pd2){if(pd1->datumssz>pd2->datumssz)return pd1->datumssz-pd2->datumssz;else return pd2->datumssz-pd1->datumssz; }A DatumKul kpzi a kt paramter dtum struktra dtumsorszm tag-jainak klnbsge abszolt rtkt. struct datum DatumMegEgy(struct datum *pd){int e=pd->ev, h=pd->ho, n=pd->nap;struct datum d;honap[2]=28+(e%4==0 && e%100 || e%400==0);if(++n>honap[h]){n=1;++h;if(h>12){h=1;++e; }}if(!DatumEHN(e, h, n, &d)) d=*pd;return d; }A paramtere dtumot inkrementl DatumMegEgymunkavltozkbarakja az vet, a hnapot s a napot. Meghatrozza az v szerinti februrpontos napszmt. Nveli eggyel a napot. Ha ez tlmenne a hnap szerintimaximlis napszmon, akkor 1 lesz, s a hnapszm nvelse jn. Ha ez13 lenne, akkor 1 lesz, s az vszm nvelse kvetkezik. A megllaptott, j v, h, nap alapjn a DatumEHN feltlti a loklis, ddtum objektumot. Ha az j dtum rvnytelen volt, akkor a vltozatlan-sgot jelzend a rutin hozzrendeli dhez a paramter cmen lev, eredetidtumot. C programnyelv 233A hozzrendels a paramter cmen lev (ezrt kell el az indirek-ci)structdatumminden tagjt egy az egyben tmsolja a balrtk,d,loklis dtum objektum tagjaiba rendre. A visszatrs sorn a DatumMegEgy ltrehoz a veremben egy ideigle-nes dtum objektumot, melybe tagrltagra bemsolja a dloklis dtumvltozt. Visszatrs utn aztn a main hozzrendeli az ideiglenes dtumobjektumot a mainben loklis dhez. struct datum DatumMegint(struct datum *pd, int np){int e=pd->ev, h=pd->ho, n=pd->nap;long dpd = pd->datumssz + np + 365;/* A tiszta j konstans 365.24223 lenne kzi szmts szerint!!!! */static double oszto=365.24225;struct datum d=*pd;if(np MAXDATUM){e=9999;h=12;n=31; }else {e= (int)dpd/oszto;n=dpd-e*365l-e/4+e/100-e/400;honap[2]=28+(e%4==0 && e%100 || e%400==0);for(h=1; n > honap[h]; ++h)n-=honap[h]; }if(!DatumEHN(e, h, n, &d)) d=*pd;return d; }Csak a kezdett s a vgt tekintve a pozitv napszmot a dtumhoz adDatumMegint a DatumMegEgygyel megegyezen dolgozik. Ltszik, hogy negatv, hozzadand napszmot, vagy a mvelet v-gn rvnytelen dtumot kapva, az eredeti dtum objektumot szolgltatjaa rutin vltozatlanul. Adtumsorszmot megnveli anapszmmal smg365tel. Hagymeghaladn a 9999.12.31et, akkor ezt adn vissza. Ha nem, akkor az jdtumsorszmot elosztjaatapasztalati alapona[MINDATUM,MAX-DATUM] tartomnybanrvnyesvenknti tlagos napszmmal, s ezlesz az j vszm. Visszaszmolja belle az j v pontos napszmt, s akt rtk klnbsgbl hnap s napszmot kpez. /* PELDA29.C: A dtumok kezelsnek kiprblsa. */#include "DATUM.H"void main(void) {long kul;struct datum d1, d2, d;printf("Dtum mveletek:\n\n");DatumEHN(2003, 12, 31, &d1);DatumKAR("2003-2-13", &d2);234 STRUKTRK S UNIKprintf("A(z) %s. s a(z) %s. klnbsge %ld nap!\n",d1.datumlanc, d2.datumlanc,(kul=DatumKul(&d1, &d2)));d=DatumMegEgy(&d1);printf("A(z) %s. + 1 a(z) %s.\n", d1.datumlanc,d.datumlanc);d=DatumMegint(&d2, (int)kul);printf("A(z) %s. + %ld a(z) %s.\n", d2.datumlanc, kul, d.datumlanc);printf("A(z) %s. %s.\n", d2.datumlanc, NapNev(&d2)); }Megoldand feladatok:Bvtse a DATUM.H s DATUM.C fjlokat a kvetkez funkcikat el-lt fggvnyekkel! Persze prblja is ki ket! - A hnapnv karakterlnc ellltsa a hnapszm alapjn. - Olyan karakterlnc alak dtum ltrehozsa, melyben a hnap meg-nevezse szerepel a hnap szma helyett. - A DatumMegintolyan trsa, hogy a napszm paramter negatvis lehessen. Ksztsen ugyanilyen szellemben struktrt s kezel fggvnycsaldotaz idre is! 10.6 nhivatkoz struktrk s dinamikus adatszerkezetek Tudjuk, hogy a struktrnak nem lehet - void, - nem teljes s- fggvnytpus tagja, de nem lehet tag - az ppen definci alatt ll struktra sem. Lehet viszont tag nem teljes tpus struktrra, gy akr a defincialatt llra, mutat mutat. Azt a struktrt, melynek legalbb egy nmagra mutat tagja van,n-hivatkoz struktrnak nevezik. Adinamikus adatszerkezeteket [3]: listkat, fkat stb.ler adatkonst-rukcik a Cben nhivatkoz struktrk. Nzznk nhnyat! Egyirny listhoz pldul a kvetekez struktra lenne hasznlhat: struct List1{C programnyelv 235ADAT adat;struct List1 *kov; };, ahol az ADAT tpus adat tagon valamilyen, a lista egy elemben tro-land adatokat ler struktrt kell rteni. A kov az egyirny lista kvet-kez structList1tpus elemre mutat,ill.a lista vgtNULLmutatjelzi. A lista kezelhetsghez ezen tl mr csak egy horgonypontra, sesetleg egy seged mutatra struct List1 *KezdoPont = NULL, *seged;van szksg a listt manipull programban. Tegyk fel, hogy ismertek az ADATok, s vegyk fel a lista els elemt! if(!(KezdoPont=seged=(struct List1*)malloc(sizeof(struct List1)))){printf("Elfogyott a memria!\n");exit(1); }else{/* seged->adat vegye fel az ADATok rtkt! */seged->kov=NULL; }A lista kvetkez eleme: if(!(seged->kov=(struct List1*)malloc(sizeof(struct List1)))){printf("Elfogyott a memria!\n");exit(1); }else{/* seged->adat vegye fel az ADATok rtkt! */seged->kov=NULL; }/* . . . */Elg!rjunkBeszur1fggvnyt, melyparamterknt megkapjaabe-szrand ADATokat, s annak a listaelemnek a cmt, mely utnra az jlistaelem kell, hogy kerljn! Ha mg nincs is lista, akkor ezen a pozcinkapjon NULL mutatt a rutin! A visszatrsi rtk legyen a most ltestettlistaelem cme, ill. NULL mutat, ha elfogyott a memria! struct List1 *BeSzur1(ADAT a, struct List1 *elozo){struct List1 *p;if(p=(struct List1 *)malloc(sizeof(struct List1))){p->adat=a;if(elozo){p->kov=elozo->kov;elozo->kov=p; }else p->kov=NULL; }return p; }Ekkor a lista ltrehozsa a kvetkez: KezdoPont=seged=BeSzur1(adatok, NULL);while(/* Vannak kvetkez adatok? */&&seged!=NULL)236 STRUKTRK S UNIKseged=BeSzur1(adatok, seged);if(!seged){printf("Elfogyott a memria!\n");exit(1); }A ltrehozott egyirny lista felhasznls utn a kvetkez kddal sem-misthet meg: while(KezdoPont){seged=KezdoPont->kov;free(KezdoPont);KezdoPont=seged; }Az egyirny listban lehet j elemet brhov beszrni (BeSzur1), br-honnt trlni,dealistt ahogyan amegsemmistkdismutatja csak elrehaladva lehet elrni, visszafel lpkedve nem. Az odavisszaha-ladshoz ktirny lista kell: struct List2{ADAT adat;struct List2 *kov, *elo; };struct List2 *KezdoPont = NULL, *seged;A visszalpegets lehetsgt a megelz listaelemre mutat, elo muta-ttag biztostja. A lista vgt mindkt irnyban NULL mutat jelzi. A be-szrs: struct List2 *BeSzur2(ADAT a, struct List2 *elozo){struct List2 *p;if(p=(struct List2 *)malloc(sizeof(struct List2))){p->adat=a;if(elozo){p->elo=elozo;p->kov=elozo->kov;elozo->kov=p;if(p->kov) p->kov->elo=p; }else p->elo=p->kov=NULL; }return p; }A BeSzur2csak egyet nem tud: a ltez els elem el beszrni. Ezengy segthetnk: seged=BeSzur2(adatok, NULL);seged->kov=KezdoPont;KezdoPont=seged;A trls: struct List2 *Torol2(struct List2 *ezt){struct List2 *p=NULL;if(ezt){p=ezt->kov;if(ezt->elo) ezt->elo->kov=ezt->kov;if(ezt->kov) ezt->kov->elo=ezt->elo;C programnyelv 237free(ezt); }return p; }A Torol2 fggvnynek is csak a ltez, legels elem trlsekor kell se-gteni, hisz vltozik a KezdoPont=Torol2(KezdoPont);Felhasznls utn a ktirny lista is ugyangy semmisthet meg, mintaz egyirny. A fk kzl vlasszuk ki a binris keresft! Ennek pontjaiban legfel-jebb kett az elgazsok szma, s a pontokban helyet foglal struktrkADATrsze alapjn a fa, mondjuk, nvekvleg rendezett. Ltezik tehtegy int Hasonlit(ADAT a1, ADAT a2);rutin, mely zrust szolgltat, ha a1==a2, pozitv rtket, ha a1>a2, ill. ne-gatvat egybknt. A binris keresfban a mindenkori aktulis pont balgn lev pontok kzl egy sem nagyobb, s a jobb gn helyet foglalkkzl viszont egyik sem kisebb az aktulis pontnl. Az adatstruktra: struct BinFa{ADAT adat;struct BinFa *bal, *jobb; };struct BinFa *KezdoPont = NULL;A beszrst vgz rekurzv fggvny a kvetkez: struct BinFa *BeSzurBF(ADAT a, struct BinFa *p){int fel;if(!p){ /* j pont kszl. */if(p=(struct BinFa *)malloc(sizeof(struct BinFa))){p->adat=a;p->bal=p->jobb=NULL; }else printf("Elfogyott a memria!\n"); }else if((fel=Hasonlit(a, p->adat))==0)/* Volt mr ilyen ADAT, s itt ez a kd van. */else if(felbal=BeSzurBF(a, p->bal);else /* A jobb oldali rszfba val. */p->jobb=BeSzurBF(a, p->jobb);return(p); }A kvetkez rekurzv fggvny nvekvleg rendezett sorrendben vgezel minden ponton valamilyen tevkenysget: void Tevekeny(struct BinFa *p){if(p){Tevekeny(p->bal);/* Itt van a tevkenysg kdja. */Tevekeny(p->jobb); } }238 STRUKTRK S UNIKKeressk meg egy szvegfjlban a benne elfordul szavakat! llapt-suk meg ezen kvl, hogy a szavak a szvegfjl mely sorszm soraibanfordulnak el! Ha ugyanaz a sz egy sorban tbbszr is megtallhat, asor sorszmt ekkor is csak egyszer kell kzlni. Vgl kzlendk a sza-vak, s az elfordulsi sor sorszmok nvsorban! A megoldsban aszavak trolshoz binris keresft hasznlunk, s aszhoztartozelfordulsi sor sorszmokat mindenponthoztartozanegyirny listban tartjuk nyilvn. A PELDA30 programot a parancssorbl PELDA30 < PELDA30.C > EREDMENY.TXTmdon indthatjuk, s a kszlt lista az EREDMENY.TXT fjlban tanul-mnyozhat. /* PELDA30.C: Kirja a szvegben elfordul szavak listjt s megadja azt is, hogy a szavak milyen sorszm sorok- ban fordultak el! */#include #include #include #include #define MAXSOR 256 /* A beolvasott sor max. hossza. *//* A sorok sorszmainak egyirny listja: */struct List1{int sorsz;struct List1 *kov; };/* A binris keres fa: */struct BinFa{ /* Alapcsompont. */char *szo; /* A szra mutat. */struct List1 *sorok; /* A sorok sorszmai. */struct BinFa *bal; /* A bal oldali g. */struct BinFa *jobb;}; /* A jobb oldali g. *//* Fggvny prototpusok: */struct BinFa *BeSzurBF(char *, int, struct BinFa *);void SorMeg(struct BinFa *, int);void Kiir(struct BinFa *);int main(void){static char szoelv[]=" \t\n\r\f\"\'\\\a\?"":;,.()[]{}*/%+-&|^~!=#";struct BinFa *KezdoPont=NULL;char sor[MAXSOR], *szo;int sorszam=1;printf("Szavak keresztreferencija szvegben:\n");while(sor[MAXSOR-1]=2, fgets(sor, MAXSOR, stdin)){if(!sor[MAXSOR-1]&&sor[MAXSOR-2]!='\n')printf("Lehet kis elsorszmozs!\n");szo=strtok(sor, szoelv);while(szo){KezdoPont=BeSzurBF(szo, sorszam, KezdoPont);szo=strtok(NULL, szoelv); }C programnyelv 239++sorszam; }Kiir(KezdoPont);return 0; }A fgets fggvny a getlinehoz nagyon hasonlan dolgozik. Karak-terlncot olvas be a szabvny bemenetrl (stdin), melyet az els param-ter cmtl kezdve letrol a memriban. Az olvass lell, ha a fggvny amsodik paramternl eggyel kevesebb (MAXSOR 1), vagy \n ka-raktert olvasott. A getlinetl eltren azonban a rutin a \nt is elhelyezia lncban, s a lnc vghez mg egy \0t is hozzilleszt. Sikeres eset-ben az fgets az els paramter mutatval tr vissza. Fjlvgen, vagy hibaesetn viszont NULLt kapunk tle. Haasortmbutolspozcijnvanalnczrzrus, deelttenincs ott a soremels karakter, akkor az aktulisan olvasott sor nem frt elegy menetben a bemeneti pufferben, s ebbl kvetkezleg elsorszmozstrtnik. Azstrtoklersamegtallhat aMUTATKszakaszKarakter-lnc kezel fggvnyek fejezetben!struct BinFa *BeSzurBF(char *a,int sorszam,struct BinFa *p){ int fel;if(!p){ /* j sz rkezett */p=(struct BinFa *)malloc(sizeof(struct BinFa));if(p&&(p->szo=(char *)malloc(strlen(a)+1))){strcpy(p->szo, a);if(p->sorok=(struct List1 *)malloc(sizeof(struct List1))){p->sorok->sorsz=sorszam;p->sorok->kov=NULL; }p->bal=p->jobb=NULL; }if(!p||!p->szo||!p->sorok){printf("Elfogyott a memria!\n");exit(1); } }else if((fel=strcmp(a, p->szo))==0)SorMeg(p, sorszam);else if(felbal=BeSzurBF(a, sorszam, p->bal);else p->jobb=BeSzurBF(a, sorszam, p->jobb);return(p); }/* Sorszm hozzadsa az egyirny lista vghez: */void SorMeg(struct BinFa *p, int sorszam){struct List1 *seged=p->sorok;while(seged->kov!=NULL && seged->sorsz!=sorszam)seged=seged->kov;if(seged->sorsz!=sorszam){if(seged->kov=(struct List1 *)malloc(sizeof(struct List1))){seged->kov->sorsz=sorszam;seged->kov->kov=NULL; }240 STRUKTRK S UNIKelse{printf("Elfogyott a memria!\n");exit(1); } } }/* A fa kirsa: */void Kiir(struct BinFa *p){struct List1 *seged;int i;if(p){Kiir(p->bal);printf("%s:\n", p->szo);for(seged=p->sorok, i=0; seged; seged=seged->kov,++i)printf("%7d|", seged->sorsz);if(i%10!=9) printf("\n");Kiir(p->jobb); } }Megoldand feladatok:Fejlessze tovbb a PELDA30.Cben megoldott feladatot a kvetkez-kpp, s persze prblja is ki! - C parancssori paramterrel indtva a program ne gyjtse a szabv-nyos C kulcsszavak elfordulsait. - Ha aszabvnykimenet (stdout) nem fjl, akkor bontsa lapokra alistt a szoftver. - Nparancssori paramterrel startolva jelentesse mega programmegsorszmozva, de egybknt vltozatlanul a bemenetet. 10.7 Struktra trillesztseA fordt a struktratagokat deklarcijuk sorrendjben nvekv mem-ria cmekenhelyezi el. Mindenadatobjektumrendelkezik trillesztsiignnyel is. A fordt olyan eltolssal helyezi el az adatobjektumot, hogyazeltols % trillesztsi-igny == 0zrus legyen. Struktrk esetn ez a szably a tagok elhelyezsre vonat-kozik. Ha pldnak vesszk astruct struki {int i;char lanc[3];double d; } s;struktrt, akkor tudjuk, hogy az s objektumot nvekv memria cmekengy helyezi el a fordt, hogy 1. ngy bjtot (32 bites esetben) foglal az int tagnak, 2. aztn a 3 bjtos karakterlnc kvetkezik, s C programnyelv 2413. vgl 8 bjtot rezervl a double taghoz. Bizonyos fordt opcik, vagy valamilyen #pragmadirektva segt-sgvel vezrelhetjk a struktra adatok memriabeli illeszkedst. Ez aztjelenti, hogy az adatokat 1gyel, 2vel, 4gyel stb. maradk nlkl oszt-hatcmeken: bjthatron, szhatron, duplaszhatronstb. kell elhe-lyezni. Felkrjk az olvast, hogy nzzen utna a dolognak a programfej-lesztrendszeresegtsgben! Brhogyanis, emebelltsokhatsraafordt minden struktratagot, az elst kveten, olyan hatron trol, melymegfelel a tag trillesztsi ignynek. A bjthatrra igazts azt jelenti, hogy - a struktra objektum elhelyezse brmilyen cmen kezddhet, s - a struktratagok ugyancsak brmilyen cmen elhelyezhetk tpusuk-tl fggetlenl. A plda sobjektum sszesen 15 bjtot foglal el ilyenkor, s a memriatrkp a kvetkez:i lanc d4 bjt 3 bjt 8 bjtA szhatrra igazts azt jelenti, hogy- a struktra objektum kezdcme pros kell, hogy legyen, s - a struktratagok - a char tpustl eltekintve - ugyancsak pros cme-ken helyezkednek el.A plda s objektum gy sszesen 16 bjtot foglal el. Egy bjt elveszik, sa memria trkp a kvetkez:i lanc = d4 bjt 3 bjt 1 b 8 bjtA dupla szhatrra igazts azt jelenti, hogy- a struktra objektum elhelyezse nggyel maradk nlkl oszthatcmen (dupla szhatron) trtnik meg,- a char tpus struktratagok bjthatron kezddnek,- a short tpus tagok szhatron indulnak s- a tbbi tpus tag dupla szhatron (nggyel maradk nlkl osztha-t cmen) kezddik.Dupla szhatrra igaztva az s objektum megegyezik az elzvel. A ha-trra igaztsi jtk folytathat rtelemszeren tovbb.242 STRUKTRK S UNIKPersze a struktrt nem ilyen butn definilva igaztstl fggetle-nl elrhetjk, hogy egyetlen bjt elvesztse se kvetkezzk be:struct struki {double d;int i;char lanc[3]; } s;10.8 UNIKAz uni tpus a struktrbl szrmazik, de a tagok kztt zrus a cmel-tols. Azuni azt biztostja, hogy ugyanazon a memria terleten tbb,klnfle tpus adatot trolhassunk. Az union unio{int i;double d;char t[5]; } u, *pu = &u, tu[23];definciban az uunion uniotpus objektum, a puilyen tpus objek-tumra mutat mutat, s a tu egy 23 ilyen tpus elembl ll tmb azo-nostja. Az u objektum - pldul - egyazon memria terleten biztostjaaz i nev int, a d azonostj double s a t nev karaktertmb tpus tag-jainak elhelyezst, azaz:&u &u.i &u.d ...Ennek szellembenaztn igaz, hogy az uni objektumra mutat mutatannak egyben minden tagjra is mutat. (pu=&u) &u.i &u.d ...Termszetesenadologcsakamutatkrtkreigaz, mert az&u(union unio *), az &u.i(int *) s az &u.d (double *), azaz tpusban el-trnek. Haazonbanunit megcmzmutatt explicit tpusmdostssaltagjra irnyul mutatv alaktjuk, akkor az eredmny mutat magra atagra mutat: u.d=3.14;printf(*(&u.d) = %f\n, *(double *)pu);Az uni helyfoglalsa a trban akkora, hogy benne a legnagyobb bjtig-ny tagja is elfr, azaz:sizeof(union unio) sizeof(u) 8.Teht 4 bjt felhasznlatlan, ha int adatot tartunk benne, ill. 3 bjt elrhe-tetlen, ha karaktertmbt rakunk bele. Az uni egy idben csak egyetlentagjt tartalmazhatja. C programnyelv 243Lttuk mr, hogy az unitagokat ugyanazokkal a tagszelektor operto-rokkal rhetjk el, mint a struktratagokat:u.d = 3.15;printf(u.d=%f\n, u.d); /* OK: u.d=3.15 jelenik meg. */printf(u.i=%d\n, u.i); /* Furcsa eredmny szletik. */printf(u.t[0]=%c\n, u.t[0]);/* Valami csak megjelenik, vagy sem. */printf(u.t=%s\n, u.t); /* Csoda karakterlnc ltszik. Ki tudja, hol van a lnc vge!*/strcpy(pu->t, Hoh);printf(u.t=%s\n, pu->t);/* OK: a Hoh ltszik. */printf(u.i=%d\n, pu->i);/* Furcsa eredmny szletik. */printf(u.d=%f\n, pu->d);/* Nagyon szortsunk, hogy ne legyen lebegpontos tl vagy alulcsorduls! */eValahonnan teht clszer tudni - pldul gy, hogy nyilvntartjuk -milyen tpus adat is tallhat pillanatnyilag az uni objektumban, s aztszabad csak elrni. Ha egy uni tbbfle, de azonos kezd szerkezet struktrval indul, saz uni tartalma e struktrk egyike, akkor lehetsg van az uni kzskezdeti rszre hivatkozni. Pldul: union{struct{ int tipus;} t;struct{ int tipus; int iadat;} ti;struct{ int tipus; double dadat;} td;/* . . . */ } u;/* . . . */u.td.tipus = DOUBLE;u.td.dadat = 3.14;/* . . . */if(u.t.tipus == DOUBLE) printf(%f\n, u.td.dadat);else if(u.t.tipus == INT) printf(%d\n, u.ti.iadat);else /* . . . */Unikkal pontosan ugyanazok a mveletek vgezhetk, mint a struk-trkkal. Hozzrendelhetk, msolhatk, hozzfrhetnk a tagjaikhoz, k-pezhet a cmk, tadhatk fggvnyeknek s rutinok visszatrsi rtkeiis lehetnek. 10.8.1UnideklarcikAz ltalnos deklarcis szably azonos a struktrval. Az eltrsek akvetkezk:- Az unik tartalmazhatnak bitmezket. Mindegyik bitmez azonbanaz uni kezdettl indul, s gy kzlk csak egy lehet aktv. 244 STRUKTRK S UNIKeA kvetkez fejezetben trgyalt bitmezk gpfgg brzolsra ittis fel szeretnnk hvni kln a figyelmet! - Azunitagjanemlehetvoid, nemteljes, vagyfggvnytpus.Nem lehet a definci alatt ll uni egy pldnya, de ilyenre mutatmutat persze lehet. - Unik esetben a deklarciban csak az elsnek deklarlt tagnak ad-hat explicit kezdrtk. Pldul: union unika{int i;double d;char t[6]; } u = { 24 };Csak az u.i kaphatott, s kapott is 24 kezdrtket. Ha kicsit bonyo-lultabb esetet nznk: union{char x[2][3];int i, j ,k; } y = {{{'1'}, {'4'}}};Az yuni vltoz inicializlsakor aggregtum inicializtort hasz-nlunk, mert az uni els tagja ktdimenzis tmb. Az 1 iniciali-ztor a tmb els sorhoz tartozik,gy az y.x[0][0] felveszi az 1rtket, s a sor tovbbi elemei tiszta zrusok lesznek az implicit kez-drtk ads szablyai szerint. A 4 a msodik sor els elemnekinicializtora, azaz y.x[1][0] = 4, y.x[1][1] = 0 s y.x[1][2] = 0. - Loklis lettartam unik esetn az inicializtor kompatibilis unitpus egyszer kifejezs is lehet: union unika{int i;double d;char t[6]; } u = { 24 }, u1 = u;- Az unideklarciban is elhagyhat az unicmke. Az unik elfor-dulhatnakstruktrkban, tmbkben, stmbk, ill. struktrkislehetnek tagok unikban: #define MERET 20struct {char *nev;int adat;int u_tipus; /* Az uniban aktulisan trolt */union{ /* tpus nyilvntartshoz. */int i;float f;char *mutato; } u;} tomb[MERET];C programnyelv 245Ilyenkor a tomb i-edik eleme i unitagjhoz val hozzfrs alakja: tomb[i].u.is a mutato tag mutatta els karakter elrsnek formja: *tomb[i].u.mutato10.9 Bitmezk (bit fields)Bitmezk csak struktra vagy uni tagjaknt definilhatk, de a strukt-rban s az uniban akr keverten is elfordulhatnak bitmez s nem bit-mez tagok. A bitmez struktratag deklarcis szintaktikja kicsit eltr anorml tagoktl:tpusspecifiktor : konstans-kifejezs;, ahol a tpusspecifiktor csak- signed int,- unsigned int vagy- intlehet az ANSI C szabvny szerint. Az inttulajdonkppensigned int.Adeklartor a bitmez azonostja, mely el is maradhat. Ilyenkor a nvtelenbitmez specifiklta bitekre nem tudunk hivatkozni,s a bitek futsidejtartalma elre megjsolhatatlan. A konstans-kifejezs csak egszrtk le-het. Zrus s sizeof(int)*8 kzttinek kell lennie, s a bitmez szlessgthatrozza meg. e Bitmez csak struktra vagy uni tagjaknt deklarlhat. Nem k-pezhet azonban bitmezk tmbje. Fggvnynek sem lehet visszaadott r-tke a bitmez. Nem megengedett a bitmezre mutat mutat s tilos hi-vatkozni a bitmez tag cmre, azaz nem alkalmazhat r a cm (&) ope-rtor sem. A bitmezk az intterleten (dupla szban, vagy szban) deklarcijuksorrendjben az alacsonyabb helyirtk bitpozciktl a magasabbak felhaladva foglaljk el helyket. Azintpontosmrete, bitmezvelval feltltsnek szablyai ssorrendje a programfejleszt rendszertl fgg. Clszer teht a segtsg-ben utnanzni a dolognak. Maradjunk meg azonban az elz bekezds-ben emltett szablynl, s a knnyebb szemlltethetsg vgett mg azt isttelezzk fel, hogy az int 16 bites! Ilyenkor pldul a: struct bitmezo{int i: 2;unsigned j: 5;246 STRUKTRK S UNIKint : 4, k: 1;unsigned m: 4; } b, *pb = &b;ltal elfoglalt sz bittrkpe a kvetkez: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0m k = j iHa az m bitmez tag szlessge 4-nl nagyobb lett volna, akkor j sztkezdett volna a fordt, s az elz sz fels ngy bitje kihasznlatlan ma-radt volna. ltalnossgban: a (dupla)szn tllg bitmez j (dupla)sztkezd, s az elz (dupla)szban a fels bitek kihasznlatlanok maradnak. Ha a deklarciban valamely (nvtelen) bitmeznl zrus szless-get adunkmeg, akkor mestersgesenknyszertjkki ezt akvetkez(dupla) szhatrra llst. e Abitmeznekelgszlesnekkell lennieahhoz,hogy argztettbitminta elfrjen benne! Pldul a kvetkez tagdeklarcik illeglisak: int alfa : 17;unsigned beta : 32A bitmezk ugyanazokkal a tagszelektor opertorokkal (. s ->) rhetkel, mint a nem bitmez tagok: b.i vagy pb->kAbitmezkkissignedvagy unsignedegsz rtkekkntviselkednek(rgtntesnekazegszellptetsen),azaz kifejezsekbenott fordul-hatnakel, aholegybkntaritmetikai (egsz)rtkeklehetnek.signedesetben a legmagasabb helyirtk bit (MSB - most significant bit) eljel-bitknt viselkedik, azaz az int i : 2 lehetsges rtkei pldul: 00: 0, 01: +1, 10: -2, 11: -1Az unsigned m : 4 lehetsges rtkei: 0000: 0, 0001: 1, . . ., 1111: 15ltalnossgban:unsigned x : szlessg; /* 0 =0) ? (unsigned char)(*(f)->curp++) :\258 SZABVNY, MAGAS SZINT BEMENET, KIMENET_fgetc(f))int ungetc(int c, FILE *stream);A fggvny visszateszi a streambemeneti folyamba a cparamter un-signed char tpusv konvertlt rtkt gy, hogy a kvetkez olvasssalez legyen az els elrhet karakter. A szablyos mkds csak egyetlenkarakter visszahelyezse esetn garantlt, de a visszatett karakter nem le-het az EOF. Kt egymst kvet ungetchvs hatsra mr csak a msodiknakvisszatett karakter rhet el, mondjuk, a kvetkez getcvel, azaz az elselveszik. Gondoljuk csak meg, hogyha nincs puffer, akkor a visszattelheza FILE struktra egyetlen hold tagja ll rendelkezsre! Az fflush, az fseek, az fsetpos, vagy a rewind trli a bemenetre vissza-tett karaktert. Sikeres hvskor az ungetca visszatett karaktert adja vissza. Hiba ese-tn viszont EOFot kapunk tle. Az char *fgets(char *s, int n, FILE *stream);karakterlncot hoz be a stream folyambl, melyet az s cmtl kezdve he-lyez el a memriban. Az tvitel lell, ha a fggvny n - 1 karaktert, vagy\nt olvasott.Arutin a \n karaktert is kiteszi a lncba, s a vghezmg zr \0t is illeszt. Sikeres esetben az fgets az s karakterlncra mutat mutatval tr vissza.Fjlvgen, vagy hiba esetn viszont NULLt szolgltat. Vegykszre, hogyajegyzetelejetahasznltgetlinefggvnycsak annyiban tr el az fgetstl, hogy: - A beolvasott karakterlnc mrett adja vissza. - Aszabvnybemenetrl (stdin) olvas, snemmsfolyambl, gyeggyel kevesebb a paramtere. - n karaktert hoz be legfeljebb, vagy \nig, de magt a soremels ka-raktert nem teszi be az eredmny karakterlncba. size_t fread(void *ptr, size_t size, size_t n, FILE *stream); A fggvny n * size bjtot olvas a stream folyambl, melyet a ptr para-mterrelmutatottcmenhelyezel. Visszaadott rtkenemabeolvasottbjtok szma, hanem abeolvasott bjtok szma / sizeC programnyelv 259sikeres esetben. Hiba, vagy fjlvg esetn ez persze nem egyezik nnel. Az eddig ismertetett bemeneti fggvnyek nem konvertltk a beolva-sott karakter(lnco)t. Az int fscanf(FILE *stream, const char *format);viszont a stream folyambl karakterenknt olvasva egy sor bemeneti me-ztvizsgl.Aztnminden meztaformatkarakterlncnak megfelelenkonvertl, s letrol rendre a paramter cimeken. A formatkarakterlnc-banugyanannyikonverzit okozformtumspecifikcinakkell lennie,mint ahny bemeneti mez van. Ajellsben a az elhagyhatsgot, a ... a megelz paramtertetszleges szm ismtelhetsgt jelenti. A bemeneti mez defincija,a formzs s a konvertls rszletei a scanf fggvny lersban tallha-tk meg! Azfscanfasikeresenvizsglt, konvertlt sletroltbemenetimezkszmval tr vissza. Ha a fggvny az olvasst a fjl vgn ksreln meg,vagy valamilyen hiba trtnne, akkor EOF-ot kapunk tle vissza. A rutinzrussal is visszatrhet, ami azt jelenti, hogy egyetlen vizsglt mezt semtrolt le. 11.5 Kimeneti mveletekint fputc(int c, FILE *stream);A fggvny a c unsigned char tpusv konvertlt rtkt rja ki a stre-am folyamba. Sikeres esetben a c karaktert kapjuk vissza tle, hiba bek-vetkeztekor viszont EOFot. A int putc(int c, FILE *stream);makr, mint ahogyan ez a lehetsges defincijbl is ltszik, ugyanezt te-szi: #define putc(c,f) \((++((f)->level)curp++)=(c)) :\_fputc((c),f))int fputs(const char *s, FILE *stream);A fggvny az s karakterlncot kirja a stream folyamba. Nem fz hozz\n karaktert, s a lezr \0 karakter sem kerl t. Sikeresesetbennemnegatvrtkkel tr vissza. HibaesetnviszontEOFot kapunk tle. Az size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);260 SZABVNY, MAGAS SZINT BEMENET, KIMENETa ptr cmmel mutatott memria terletrl n * size bjtot r ki a stream fo-lyamba. Visszaadott rtke nem a kirt bjtok szma, hanem a kirt bjtok szma / sizesikeres esetben. Hiba bekvetkeztekor ez nem egyezik nnel. Az eddigi kimeneti fggvnyek nem vgeztek konverzit. Az int fprintf(FILE *stream, const char *format);fogad egy sor parametert, melyeket a format karakterlncnak megfelelenformz (konvertl), s kivisz a streamfolyamba. A formatkarakterlnc-banugyanannyikonverzit okozformtumspecifikcinakkell lennie,mint ahny parameter van.Ajellsben a az elhagyhatsgot, a ... a megelz paramtertetszlegesszmismtelhetsgt jelenti. A formzs s a konvertlsrszletei a printf fggvny lersban tallhatk meg! Az fprintf a folyamba kivitt karakterek szmval tr vissza sikeres eset-ben, ill. EOF-ot kapunk tle hiba bekvetkeztekor. 11.6 Folyamok lezrsaint fclose(FILE *stream);Arutinlezrjaa streamfolyamot. Ez eltt azonban rti a folyamhoztartoz puffert, s a pufferhez automatikusan alloklt memrit fel is sza-badtja. e Ez utbbi nem vonatkozik a setbuf, vagy a setvbuffggvnyekkelhozzrendelt pufferekre. Ezek gyei csak a felhasznlra tartoznak. Sikeres esetben az fclose zrussal tr vissza. Hiba esetn viszont EOFot kapunk tle. 11.7 HibakezelsTudjuk, hogy a szabvny knyvtri fggvnyek gy a magas szint be-menetet, kimenetet kezelk is a hibt, a kivteles esetet gy jelzik, hogyvalamilyen specilis rtket (EOF, NULL mutat, HUGE_VAL stb.) ad-nak vissza, s az errno globlis hibavltozba belltjk a hiba kdjt. Ahibakdok azERRNO.Hfejfjlbandefinilt, egsz, nemzrusrtkszimbolikus llandk. Programunkindulsakor aszabvnybemeneten(stdin) skimeneten(stdout) tl a hibakimenet (stderr) is rendelkezsre ll, s a hibazeneteketez utbbin clszer megjelentetni. Az stderra kperny (karakteres ab-C programnyelv 261lak) alaprtelmezs szerint, s nem is irnythat t fjlba a legtbb oper-cisrendszerben,mint ahogyan a bemenettel () ezmegtehet volt a programot futtat parancssorban. Mit jelentessnk meg hibazenetknt az stderren? Termszetesen brmilyenszveget kirathatunk, de a hibakdokhozprogramfejlszt rendszertl fggen hibazenet karakterlncok is tartoz-nak, s ezek is megjelentethetk. A hibakodhoz tartoz hibazenet karak-terlnc kezdcmt szolgltatja a szabvnyos #include char *strerror(int hibakod); fggvny, s az zenet meg is jelentethet fprintf(stderr, Hiba: %s\n, strerror(hibakod));mdon. Avoid perror(const char *s);kirjaazstderrreazt ahibazenetet, melyet alegutbbi hibt okoz,knyvtri fggvny hvsa idzett el. Elszr megjelenteti az s karakter-lncot a rutin, aztn kettspontot (:) tesz, majd az errnoaktulis rtk-nek megfelel zenet karakterlncot rja ki lezr \n-nel. Teht pldul a perror(Hiba: ) megfelel a fprintf(stderr, Hiba: %s\n, strerror(errno));fggvnyhvsnak. e Vigyzat! Az errno rtkt csak kzvetlenl a hibt okoz rutin h-vsa utn szabad felhasznlni, mert a kvetkez knyvtri fggvny meg-idzse fellrhatja e globlis vltoz rtkt. Ha a hibakddal mgis k-sbb kvnnnk foglalkozni, akkor tegyk el az errno rtkt egy segd-vltozba! Folyamokkal kapcsolatbanaperrorsparamtereafjlazonostszokott lenni. Meg kell trgyalnunk mg hrom, csak a folyamok hibakezelsvel fog-lalkoz fggvnyt! A void clearerr(FILE *stream);262 SZABVNY, MAGAS SZINT BEMENET, KIMENETnullzzaa streamfolyam fjlvg s hibajelzjt. Ha a folyam hibajelzbitje egyszer bebillent, akkor minden a folyamon vgzett mvelet hibvaltr vissza mindaddig, mg a hibajelzt e fggvnnyel, vagy a rewinddalnem trlik. A fjlvg jelz bitet egybknt minden bemeneti mvelet nullzza. Azint feof(FILE *stream);tbbnyire makr, mely a kvetkez lehetsges #define feof(f) ((f)->flags & _F_EOF)defincija miatt, visszaadja a fjlvg jelz bit llapott, azaz vlaszt ad afjlvg van-e krdsre.Az egyszer bebillent fjlvg jelz bit a kvetkez, e folyamra vonatkozbemeneti, pozcionl mveletig, vagy clearerrig 1 marad. Azint ferror(FILE *stream);makr ebben a szellemben #define ferror(f) ((f)->flags & _F_ERR)a hiba jelz bit llapott adja vissza. Azegyszerbebillenthiba jelz bitet csak aclearerrs arewindfggvnyek trlik. e Ha a krdses folyammal kapcsolatban a bebillent hiba jelz bit tr-lsrl nem gondoskodunk, akkor minden e folyamra meghvott tovbbifggvny hibt jelezve fog visszatrni. rjuk meg az fputc segtsgvel az fputs fggvnyt! int fputs(const char *s, FILE *stream){int c;while(c=*s++)if(c!=fputc(c, stream)) break;return ferror(stream) ? EOF : 1; }Ksztsnk szoftvert komplett hibakezelssel, mely az els parancssoriparamtere fjlt tmsolja a msodik paramtere azonostj fjlba! Ha aprogramotnemelgparancssoriparamterrelindtjk,akkorismertessehasznlatt! A msolsi folyamat elrehaladsrl tjkoztasson felttle-nl! /* PELDA31.C: Els paramter fjl msolsa a msodikba. */#include #include /* strerror miatt! */#include /* Az errno vgett! */#define KENT 10 /* Hnyanknt jelenjen meg a szmll.*/C programnyelv 263#define SZELES 10 /* Mezszlessg a szml kzlshez. */int main(int argc, char *argv[]){FILE *be, *ki; /* A be s kimeneti fjlok. */long szlo=0l; /* A szmll. */int c; /* A kv. karakter s segdvltoz. */printf("Az els paramter fjl msolsa a msodikba:\n");if(argc