| A. FÜGGELÉK | Tartalom | C. FÜGGELÉK |
B. FÜGGELÉK:
A standard könyvtár
Ebben a függelékben összefoglaljuk az ANSI szabványban definiált programkönyvtárral kapcsolatos ismereteket. A standard könyvtár nem része a szűkebb értelemben vett C nyelvnek, de gondoskodik függvények deklarálásáról, valamint adattípusok és makrók definiálásáról, amivel a szabványos C nyelvet támogató környezetet hoz létre. Az ismertetésből néhány, csak korlátozottan használható vagy más függvényekből egyszerűen előállítható függvény leírását elhagytuk, csakúgy, mint a több-bájtos karakterekkel végezhető műveleteket, valamint a helyi jellegeztességektől (pl. nyelvtől) függő részleteket.A standard könyvtár függvényei, típusai és makrói standard headerekben vannak deklarálva. Ezek a standard headerek:
<assert.h> <limits.h> <signal.h> <stdlib.h> <ctype.h> <locale.h> <stdarg.h> <string.h> <errno.h> <math.h> <stddef.h> <time.h> <float.h> <setjmp.h> <stdio.h>
Egy headerhez az
#include <headernev>
direktívával férhetünk hozzá. A headerek bármilyen sorrendben és akárhányszor beépíthetők a programba. Egy headert bármilyen külső deklaráción vagy definíción kívül, vagy bármely, a headerben deklarált függvény, típus vagy adat felhasználása előtt kell beépíteni. A headernek nem szükséges a forrásállományban lenni.Az aláhúzással kezdődő külső azonosítók a könyvtár számára vannak fenntartva, és a könyvtárban használt összes azonosító aláhúzással kezdődik vagy nagybetűs írásmóddal és kezdő aláhúzással van jelölve.
B1. Adatbevitel és adatkivitel: az <stdio.h> header
Az adatbevitelt és -kivitelt kezelő függvények és makrók, valamint a hozzájuk tartozó adattípusok az<stdio.h>headerben vannak definiálva, és ez a header alkotja a standard könyvtár közel egyharmadát.Az adatok forrása vagy címzettje (ami lemezegység vagy más periféria lehet) adatáramot kezel. A standard könyvtár a szöveges és a bináris adatáram használatát támogatja, bár ezek néhány operációs rendszerben (pl. a UNIX esetén is) azonosak. Egy szöveges adatáram egymást követő sorokból áll, az egyes sorok nulla vagy több karaktert tartlamaznak és ‘\n‘ (újsor-) karakterrel záródnak. Egy programozási környezetben szükség lehet egy szöveges adatáram valamilyen más ábrázolásmódba való alakítására (pl. a ‘\n‘ kocsivissza- és soremelés-karakterekké alakítására). Egy bináris adatáram belső adatokat tartalmazó feldolgozatlan bájtok sorozata, és fő jellegzetessége, hogy kiírása után azonnal visszaolvassa a rendszer ellenőrzés céljából.
Egy adatáram a megnyitási folyamattal kapcsolódik egy állományhoz vagy perifériához és ez a kapcsolat az adatáram lezárásával szakítható meg. Az adatállományt megnyitó eljárásFILEtípusú objektumot címző mutatóval tér vissza, és ez az objektum tartalmazza az adatáram vezérléséhez szükséges információkat. A későbbiekben, amikor nem okoz félreértést, az állománymutató és az adatáram fogalmát csereszabatosan fogjuk használni.
Amikor egy program végrehajtása megkezdődik, három adatáram, azstdin,stdoutésstderrautomatikusan megnyílik.
B1.1. Állománykezelő műveletek
A következőkben ismertetendő függvények végzik az állománykezelő műveleteket. A függvényekben használtsize_tasizeofoperátorral létrehozott előjel nélküli, egész típusú változó.
FILE*fopen(constchar*allomanynev,constchar*mod)
Azfopenfüggvény megnyitja az adott nevű állományt és visszatér egy adatárammal (állománymutatóval) vagyNULLértékkel, ha a megnyitás közben hiba volt. Amodkezelési módot megadó paraméter lehetséges értékei:
„r” szöveges állomány megnyitása olvasásra; „w” szöveges állomány létrehozása írásra, ha az állomány már létezik,
akkor előző tartalma elvész;„a” hozzáfűzés: szöveges állomány megnyitása és írás az állomány végéhez; „r+” szöveges állomány megnyitása aktuális használatra, azaz olvasásra
és írásra;„w+” szöveges állomány létrehozása aktuális használatra, az állomány korábbi tartalma (ha volt) elvész; „a+” hozzáfűzés: szöveges állomány megnyitása aktuális használatra és írás az állomány végéhez. Az aktuális használatnak megfelelő üzemmód megengedi, hogy ugyanazt az állományt olvassuk és írjunk bele. Az írási és olvasási műveletek között azfflushfüggvényt vagy egy állományon belüli pozicionálást végző függvényt kell hívni. Ha a kezelési mód paraméter a megadott betűk után abjelzést tartalmazza (pl.„rb”vagy„w+b”), akkor ez bináris állományra utal. Az állománynevek hossza max.FILENAME_MAXszámú karakter lehet. Egy időben legfeljebbFOPEN_MAXszámú állomány lehet megnyitva.
FILE*freopen(constchar*allomanynev, costchar*mod,FILE*adataram)
Afreopenfüggvény megnyitja az adott nevű állományt jelzett használati móddal és hozzárendeli a megadott adatáramot. A függvény az adatárammal tér vissza vagy ha hiba volt, aNULLértékkel. Afreopenfüggvényt általában azstdin,stdoutvagystderradatáramokhoz rendelt állományok megváltoztatására használják.
intfflush(FILE*adataram)
Kimeneti adatáramra híva azfflushfüggvény az összes pufferelt, de még ki nem írt adatot kiírja. Bemeneti adatáramra híva a függvényt az eredmény nem definiálható. A függvény normális esetben nulla értékkel, írási hiba eseténEOFértékkel tér vissza. Afflush(NULL) kiüríti az összes kimeneti adatáramot.
intfclose(FILE*adataram)
Afclosefüggvény az összes pufferelt kimeneti adatot kiírja a megadott adatáramba, törli a még be nem olvasott, de pufferelt adatot, felszabadítja az automatikusan kiosztott pufferterületeket, majd lezárja az adatáramot. A függvényEOFértékkel tér vissza, ha bármilyen hiba volt és nulla értékkel máskülönben.
intremove(constchar*allomanynev)
Aremovefüggvény eltávolítja (törli) a megadott nevű állományt, így az állomány megnyitására tett következő kísérlet hibát fog okozni. A függvény nem nulla értékkel tér vissza, ha a hozzáférési kísérlet hibát okozott.
intrename(constchar*reginev,constchar*ujnev)
Arenamefüggvény az állomány nevétreginev-rőlujnev-re változtatja. A függvény nem nulla értékkel tér vissza, ha az állományhoz való hozzáférés sikertelen.
FILE*tmpfile(void)
Atmpfilefüggvény „wb+” használati móddal létrehoz egy átmeneti állományt, amelyet automatikusan töröl a lezárásakor vagy a program normális lefutásakor. A függvény visszatérésekor normális esetben az adatáramot adja, ill. ha az állomány nem hozható létre, akkor aNULLértéket.
char*tmpnam(chars[L_tmpnam])
A függvényttmpnam(NULL) formában híva egy karaktersorozatot generál, ami nem egyezik meg egyetlen létező állomány nevével sem, és visszatéréskor ezt a karaktersorozatot tároló belső statikus tömb mutatóját adja vissza. Atmpnam(s)alakú hívás eltárolja a karaktersorozatot azs-ben, valamint függvényértékként is visszaadja. Azstömbben legalábbL_tmpnamszámú karakter számára kell hogy hely legyen. Atmpnamminden hívásakor egy nevet generál és a program végrehajtása során legalábbTMP_MAXszámú különböző név generálása garantálható. Ügyeljünk arra, hogy atmpnamcsak nevet generál és nem állományt.
intsetvbuf(FILE*stream,char*buf,intmod,size_tmeret)
Asetvbuffüggvény az adatáram pufferelését vezérli, és ezt a függvényt kell hívni írás, olvasás vagy bármilyen más állománykezelő művelet előtt. Amodparaméter lehetséges értékei:
_IOFBF teljes pufferelés; _IOLBF szöveges állományok esetén sorpufferelés; _IONBF nincs pufferelés. Ha a hívásakor abufparaméter nemNULL, akkor a függvény ezt fogja pufferként használni, máskülönben a rendszer rendel pufferterületet a függvényhez. Ameretparaméter a puffer méretét határozza meg. A függvény hiba esetén nem nulla értékkel tér vissza.
voidsetbuf(FILE*adataram,char*buf)
Ha a függvény hívásakor abufparaméterNULL, akkor az adatáram pufferelését kikapcsolja. Minden más esetben a függvény megegyezik a (void)setvbuf(adataram, buf,_IOFBF, BUFSIZ)függvénnyel.
B1.2. Formátumozott adatkivitel
A formátumozott adatkiviteli konverziót alapvetően aprintffüggvény különböző változatai végzik.
intfprintf(FILE*adataram,constchar*format, …)
Azfprintffüggvény aformatkaraktersorozatban leírt formátum szerint átalakítja és azadatarambaírja a megadott adatok értékét. A függvény a kiírt karakterek számát adja visszatérési értékként, vagy egy negatív számot, ha hiba volt.
A formátumot leíró karaktersorozat kétféle objektumot tartalmaz: közönséges karaktereket, amelyeket változtatás nélkül bemásol a kimeneti adatáramba, valamint konverziós specifikációkat, amelyek mindegyike azfprintfsoron következő argumentumának konverzióját és kiíratását vezérli. Az egyes konverziós specifikációk a % karakterrel kezdődnek és egy konverziós karakterrel végződnek. A%jel és a konverziós karakter között sorrendben a következők helyezkedhetnek el:
- Jelzők (bármilyen sorrendben), amelyek módosítják a specifikációt: mínuszjel, ami a konvertált argumentum balra igazítását írja elő a kiírási mezőben;+jel, ami azt írja elő, hogy a számok kiírása mindig előjellel együtt történjen; szóközkarakter hatására a szám elé szóköz íródik, ha az első karaktere nem előjel;0számkonverzió esetén azt írja elő, hogy a kiírási mezőben a szám előtti üres helyek vezető nullákkal töltődjenek fel;#jel a kimeneti formátum megváltoztatását írja elő.oesetén a kiírt első számjegy nulla lesz (oktális szám kiírása).Xvagyxesetén a nem nulla szám elé0xvagy0Xíródik (hexadecimális szám kiírása),e,E,gésGesetén a kiírt szám mindig tartalmazza a tizedespontot ésgvagyGesetén a szám végén lévő értéktelen nullák megmaradnak.
- A kiírási mező minimális szélességét előíró szám: az átalakított argumentum legalább ilyen szélességben (vagy ha szükséges, akkor szélesebb formában) fog kiíródni. Ha az átalakított szám a megadott mezőszélességnél kevesebb karakterből áll, akkor a mező bal széle (ill. ha balra igazítás volt előírva, akkor jobb széle) helykitöltő karakterekkel fog feltöltődni. A helykitöltő karakter normális esetben szóköz, de ha 0-val való feltöltést írtuk elő, akkor nulla.
- A pont karakter, ami elválasztja a mezőszélességet a pontosságtól.
- A pontosságot meghatározó szám, ami megadja, hogye,Eésfkonverzió esetén a tizedespont után hány számjegyet kell kiírni, vagygésGkonverzió esetén minimálisan hány számjeggyel íródjon ki egy egész szám (a szükséges szélesség elérése érdekében a szám elé vezető nullák íródnak), vagy a karaktersorozatból hány karaktert kell kiírni.
- Hosszmódosító, amih,lvagyLlehet. Ahazt jelzi, hogy a megfelelő argumentumshortvagyunsignedshortformában nyomtatható, azlazt, hogy az argumentumlongvagyunsignedlongés azLpedig azt, hogy az argumentumlongdouble.
A mezőszélesség vagy pontosság vagy mindkettő a*jellel is megadható, és ebben az esetben a kívánt érték a következő argumentum(ok)ból, az(ok) konverziójával számítódik ki (az erre a célra használt argumentumoknakinttípusúaknak kell lenni).A konverziós karaktereket és jelentésüket a B.1. táblázat tartalmazza. Ha a%jel utáni karakter nem konverziós karakter, akkor a függvény viselkedése nincs definiálva.
| A konverziós karakter | Az argumentum típusa | A nyomtatás módja |
| d, i | int | decimális szám |
| o | int | előjel nélküli oktális szám vezető nullák nélkül) |
| x, X | int | előjel nélküli hexadecimális szám (a vezető0xvagy0Xnélkül), a10…15jelzése azabcdefvagyABCDEFkarakterekkel |
| u | int | előjel nélküli decimális szám |
| c | int | egyetlen karakter |
| s | char* | karaktersorozatból karaktereket nyomtat a ‘\0‘ végjelzésig vagy a pontossággal megadott darabszámig |
| f | double | [-]m.ddddddalakú decimális szám, aholdszámjegyeinek számát a pontosság adja meg (alapfeltételezés szerintd=6) |
| e, E | double | [-]m.ddddddexx vagy[-]m.ddddddE xxalakú decimális szám, aholdszámjegyeinek számát a pontosság adja meg (alapfeltételezés szerintd=6 |
| g, G | double | %evagy%Ealakú kiírást használ, ha a kitevő< -4vagy>=pontosság, különben a%falakú kiírást használja. A tizedespont és az utána következő értéktelen nullák nem íródnak ki |
| p | void* | mutató a géptől függő kiírási formában |
| n | int* | aprintffüggvény aktuális hívásakor kiírt karakterek száma beíródik az argumentumba. Az argumentum nem konvertálódik |
| % | nincs konvertálandó argumentum | egy%jelet ír ki |
intprintf(constchar*format, …)
Aprintffüggvény teljesen egyenértékű azfprintf(stdout, …) függvénnyel.
intsprintf(char*s,constchar*format, …)
Asprintffüggvény megegyezik aprintffüggvénnyel, kivéve, hogy a kimenetet azskaraktersorozatba írja, majd a‘\0‘végjellel lezárja. Azskaraktersorozatnak elegendően hosszúnak kell lennie, hogy az eredményt tárolni tudja. A függvény visszatérésekor a kiírt karakterek számát adja (a végjel nélkül számolva).
vprintf(constchar* format,va_listarg)
vfprintf(FILE*adataram,constchar*format,va_listarg)
vsprintf(char*s,constchar*format,va_listarg)
Avprintfvfprintfésvsprintffüggvények megegyeznek aprintffüggvénnyel, kivéve, hogy a változó hosszúságú argumentumlistát azarghelyettesíti, ami ava_startmakróval inicializálható és ava_argmakróval kezelhető. A változó hosszúságú argumentumlistát kezelő eljárások az<stdarg.h>headerben találhatók és használatukat aB7. pontbanírjuk le.
B1.3. Formátumozott adatbevitel
A formátumozott adatbeviteli konverziót alapvetően ascanffüggvény különböző változatai végzik.
intfscanf(FILE*adataram,constchar*format, …)
Azfscanffüggvény a karaktersorozatként megadott formátumleírással vezérelt módon beolvas azadataram-ból egy adatot, majd annak konvertált értékét hozzárendeli a soron következő argumentumhoz. Az adatokat tároló argumentumoknak kötelezően mutató típusúaknak kell lenni! A függvény akkor fejezi be a működését, ha a teljes formátumleírást feldolgozta. A függvény visszatérési értékeEOF, ha bármilyen adatkonverzió előtt állományvége-jelet érzékelt, vagy a beolvasás során hiba történt. Minden más esetben a visszatérési érték a konvertált és argumentumokhoz hozzárendelt bemeneti adatok száma.
A formátumot leíró karaktersorozat konverziós specifikációkat tartalmaz, amelyek közvetlenül felhasználhatók a bemenet értelmezéséhez. A formátumot leíró karaktersorozat tartalma:
- Szóközök vagy tabulátorok, amelyeket a függvény a formátum feldolgozása során figyelmen kívül hagy.
- Közönséges karakterek (nem%jel), amelyek várhatóan illeszkednek a bemeneti adatáram következő nem üreshely-karaktereihez.
- Konverziós specifikációk, amelyek a%jelből, a*opcionális hozzárendelés-elnyomó karakterből, a max. mezőszélességet meghatározó számból (opcionális), a célként megadott argumentum szélességét jelzőh,lvagyLkarakterből (opcionális), valamint egy konverziós karakterből tevődnek össze.
A konverziós specifikáció a következő bemeneti mező konverziójának módját határozza meg. Normális esetben a konverzió eredménye a megfelelő argumentummal címzett változóba kerül. Ha a*hozzárendelés-elnyomó karaktert alkalmaztuk, mint pl. a%*sesetben, akkor a függvény a bemeneti mezőt egyszerűen átlépi és nem történik meg a beolvasott érték hozzárendelése a változóhoz. A bemeneti mező nem üres helyekből álló karaktersorozatként van definiálva, és a következő üreshely-karakterig, vagy ha megadtuk, akkor a mezőszélességnek megfelelő számú karakterig tart. Ez azt jelenti, hogy ascanffüggvény a bemenet keresése közben folyamatosan átolvas a sorhatárokon, mivel az új sor is üreshely-karakternek számít. (Üreshely-karakter a szóköz, a tabulátor, az új sor, a kocsivissza, a soremelés, a függőleges tabulátor és a lapemelés.)A konverziós karakterek jelzik a bemeneti mező értelmezését. A megengedett konverziós karaktereket a B.2. táblázat tartalmazza.
Ad,i,n,o,uésxkonverziós karakterek előtt ahjelzés állhat, ha a mutatóval címzett argumentum nemint, hanemshorttípusú, vagy aljelzés, ha a mutatóval címzett argumentumlongtípusú. Aze,fésgkonverziós karakterek előtt állhat azl, ha az argumentumként megadott mutatófloathelyettdoubletípusú változót címez és azL, ha a mutatólongdoubletípusú változót címez.
intscanf(constchar* format, …)
Ascanf(…)függvény megegyezik azfscanf(stdin, …)függvénnyel.
intsscanf(char*s,constchar*format, …)
Asscanf(s, …)függvény megegyezik ascanf(…)függvénnyel, kivéve, hogy a bemeneti karakterek azskaraktersorozatból olvasódnak.
| A konverziós karakter | Az argumentum típusa | A beolvasott adat |
| d | int* | decimális egész |
| i | int* | egész szám, ami lehet oktális (vezető nullákkal) vagy hexadecimális (vezető0xvagy0Xkarakterekkel) |
| o | int* | oktális egész szám (vezető nullákkal vagy azok nélkül) |
| u | unsignedint* | előjel nélküli decimális egész szám |
| x | int* | hexadecimális egész szám (a vezető0x, ill.0Xkarakterekkel vagy azok nélkül) |
| c | char* | karakterek. A következő bemeneti karakterek (alapfeltételezés szerint 1) elhelyezése a kijelölt mezőben. Az üres helyek átlépését (mint normális esetet) elnyomja, ha a következő nem üres karaktert akarjuk beolvastatni, akkor a%1sspecifikációt kell használni |
| s | char* | karaktersorozat (aposztrófok nélkül). Achar* mutató egy elegendően nagy karaktersorozatra mutat és a záró ‘\0‘ jelzést a beolvasás után automatikusan elhelyezi |
| e, f, g | float* | lebegőpontos szám, opcionális előjellel opcionális tizedesponttal és opcionális kitevővel |
| p | void* | mutató, olyan formában, ahogyan azt aprintf(„%p”)kiírta |
| n | int* | az aktuálisscanfhívással beolvasott karakterek száma beíródik az argumentumba. Nem történik adatbeolvasás, a konvertált tételek száma nem nő |
| […] | char* | a bemeneti karakteráramból beolvassa a zárójelek közötti karakterekkel (illeszkedési halmazzal) megegyező karakterekből álló leghosszabb nem üres karaktersorozatot és lezárja a‘\0‘végjellel. A[]…]formában megadott halmaz esetén a]karakter a halmaz része lesz |
| [^…] | char* | az illeszkedési halmazzal nem megegyező karakterekből álló karaktersorozat beolvasása és‘\0‘végjellel történő lezárása. A[^]…]formában megadott halmaz esetén a]karakter a halmaz része lesz |
| % | nincs hozzárendelés | %jel mint karakteres állandó |
B1.4. Karakteres adatbevitelt és adatkivitelt kezelő függvények
intfgetc(FILE*adataram)
Azfgetcfüggvény visszatér az adatáramból a következő karakterrel. A beolvasott karakterunsignedchartípusú, amelyinttípusúvá alkul. A visszatérési értékEOF, ha az olvasás elérte az állomány végét vagy az olvasás közben hiba történt.
char*fgets(char*s,intn,FILE*adataram)
Azfgetsfüggvény a következő legfeljebbn-1darab karaktert beolvassa azskarakteres tömbbe. A beolvasás leáll, ha újsor-karakter fordul elő, de az új sor beíródik az s tömbbe. A beolvasott karaktersorozat kiegészül a‘\0‘végjellel. A függvény az s tömbbel, ill. hiba vagy állomány vége eseténNULLértékkel tér vissza.
intfputc(intc,FILE*adataram)
Azfputcfüggvény ackarakterunsignedchartípusra konvertált értékét kiírja az adatáramba. Visszatérési értéke maga a kiírt karakter vagyEOF, ha hiba történt.
intfputs(constchar*s,FILE*adataram)
Azfputskiírja azskaraktersorozatot (amelynek nem szükséges‘\n‘újsorkaraktert tartalmazni) az adatáramba és normális esetben nem negatív értékkel, hiba eseténEOFértékkel tér vissza.
intgetc(FILE*adataram)
Agetcmegegyezik azfgetcfüggvénnyel, kivéve, hogy makróként van megvalósítva.
intgetchar(void)
Agetcharmegegyezik agetc(stdin) függvénnyel.
char*gets(char*s)
Agetsfüggvény beolvassa a következő bemeneti sort azskarakteres tömbbe és helyettesíti a sort lezáró újsor-karaktert a‘\0‘végjellel. A függvény azstömbbel vagy állomány vége, ill. hiba eseténNULLértékkel tér vissza.
intputc(intc,FILE*adataram)
Aputcmegegyezik azfputcfüggvénnyel, kivéve, hogy makróként van megvalósítva.
intputchar(intc)
Aputcharmegegyezik aputc(c,stdout)függvénnyel.
intputs(constchar*s)
Aputsfüggvény azstdout-ra kiírja azskaraktersorozatot és lezárja egy újsorkarakterrel. Visszatérési értéke normális esetben nem negatív, hiba eseténEOF.
intungetc(intc,FILE*adataram)
Azungetcfüggvény visszateszicunsignedchartípusúra konvertált értékét a bemeneti adatáramba, ahonnan az a következő olvasással elővehető. Csak egy karakter visszahelyezése esetén garantálható a helyes működés. AzEOFkaraktert nem lehet visszahelyezni az adatáramba. A függvény visszatérési értéke maga az adatáramba visszahelyezett karakter vagyEOF, ha hiba történt.
B1.5. A közvetlen adatbevitel és adatkivitel függvényei
size_tfread(void*ptr,size_tmeret,size_tnobj,FILE*adataram)
Azfreadfüggvény az adatáramból aptrmutatóval címzett tömbbe olvas legfeljebbnobjszámú,meretméretű objektumot. A függvény visszatérési értéke a beolvasott objektumok száma, ami kisebb lehet a megadott darabszámnál. Az állapot meghatározásához afeofésferrormakrókat kell használni.
size_tfwrite(constvoid*ptr,size_tméret,size_tnobj,FILE*adataram)
Afwritefüggvény aptrmutatóval címzett tömbbőlnobjszámú, meret méretű objektumot ír ki az adatáramba. A függvény viszatér a kiírt objektumok számával, ami hiba esetén kisebb, mintnobj.
B1.6. Állományon belül pozicionáló függvények
intfseek(FILE*adataram,longoffset,intbazis)
Azfseekfüggvény az adatáram aktuális pozícióját úgy állítja be, hogy a következő olvasás vagy írás ettől a pozíciótól kezdődően fog végbemenni. Bináris állományok esetén az új pozíció abazis-tól számítottoffsetszámú karaktere lesz, és abazisértékeSEEK_SET(az állomány kezdete),SEEK_CUR(a régi aktuális pozíció) vagySEEK_END(az állomány vége) lehet. Szöveges állományok eseténoffsetértéke nulla kell legyen vagy azftellfüggvénnyel előállított értéknek (ilyenkor abazis-nak aSEEK_SETértéket kell adni). Azfseekhiba esetén nem nulla értékkel tér vissza.
longftell(FILE*adataram)
Azftellfüggvény visszatér azadataram-hoz tartozó állomány aktuális pozíciójával vagy hiba esetén a-1Lértékkel.
voidrewind(FILE*adataram)
Arewind(allomanymutato)megegyezik azfseek(allomanymutato, 0L,SEEK_SET);clearerr(allomanymutato)függvényhívásokkal.
intfgetpos(FILE*adataram,fpos_t*ptr)
Azfgetposfüggvény aptrmutatóval címzett változóba olvassa azadataram-hoz tartozó állomány aktuális pozícióját. A kapott érték azfsetposfüggvényben használható. Azfpos_ttípus olyan, hogy alkalmas a pozíció tárolására. A függvény hiba esetén nem nulla értékkel tér vissza.
intfsetpos(FILE*adataram,constfpos_t*ptr)
Azfsetposfüggvény azadataram-hoz tartozó állományt azfgetposfüggvénnyel meghatározott és aptrmutatóval címzett helyre eltárolt pozícióba állítja. A függvény hiba esetén nem nulla értékkel tér vissza.
B1.7. Hibakezelő függvények
A könyvtári függvények többsége hiba- vagy állományvége-jelzés esetén beállítja az állapotjelzőket. Ezeket az állapotjelzőket explicit módon lehet beállítani és vizsgálni. Ezenkívül még azerrnoegész típusú kifejezés (amely az<errno.h>headerben van deklarálva) tartalmazhat egy hibaszámot, ami további információt szolgáltat a legutoljára előfordult hibáról.A hibakezelő függvények:
voidclearerr(FILE*adataram)
Aclearerrfüggvény törli azadataram-hoz tartozó, azEOF-ot és a hibákat tartalmazó állapotjelzőket.
intfeof(FILE*adataram)
Afeoffüggvény nem nulla értékkel tér vissza, ha azadataram-hoz tartozóEOFállapotjelző be van állítva.
intferror(FILE*adataram)
Aferrorfüggvény nem nulla értékkel tér vissza, ha azadataram-hoz tartozó hibaállapot-jelző be van állítva.
voidperror(constchar*s)
Aperrorfüggvény kiírja azskaraktersorozatot, valamint azerrnohibaszámhoz tartozó, gépi megvalósítástól függően definiált hibaüzenetet. A függvény úgy működik, mintha az
fprintf(stderr, "%s: %s\n", s, "hibaüzenet");utasítást adtuk volna ki. A hibaüzenet azstrerrorfüggvénnyel határozható meg, ennek leírása aB3. pontbantalálható.
B2. Karakteres vizsgálatok: a <ctype.h> header
A<ctype.h>headerben vannak a karakteres vizsgálatok függvényei deklarálva. Az egyes függvények argumentumainttípusú, amelynek értékeEOFvagyunsignedchartípusban ábrázolható kell hogy legyen. A függvények visszatérési értékeinttípusú, és nem nulla (logikailag igaz), ha acargumentum kielégíti az adott feltételt, ill. nulla (logikailag hamis), ha nem. Az egyes függvények (az igaz értékhez tartozó feltételt megadva):
isalnum(c) haisalpha(c)vagyisdigit(c)igaz (azazcbetű vagy decimális számjegy); isalpha(c) haisupper(c)vagyislower(c)igaz (azazcnagy- vagy kisbetű); iscntrl(c) hacvezérlőkarakter; isdigit(c) hacdecimális számjegy; isgraph(c) hacnyomtatható karakter (kivéve a szóközt); islower(c) hackisbetű; isprint(c) hacnyomtatható karakter, beleértve a szóközt is; ispunct(c) hacnyomtatható karakter, de nem szóköz, betű vagy számjegy; isspace(c) hacszóköz, lapemelés, új sor, kocsivissza, tabulátor, függőleges tabulátor (üreshely-karakter); isupper(c) hacnagybetű; isxdigit(c) hachexadecimális számjegy.
A hétbites ASCII karakterkészletben a nyomtatható karakterek kódja a0x20-tól(‘ ‘)0x7E-ig(‘~’)terjed. A vezérlőkarakterek kódja0-tól(NUL)0x1F-ig(US)terjed és ide tartozik még a0x7F(DEL)kódja.
Még további két konverziós függvény használható a betűkre:
inttolower(intc) cértékét kisbetűvé alakítja; inttoupper(intc) cértékét nagybetűvé alakítja.
Ha c egy nagybetű, akkor atolower(c) a megfelelő kisbetűvel, a különben magával a c értékével tér vissza. Ha c egy kisbetű, akkor atoupper(c) visszatér a megfelelő nagybetűvel, különben visszaadja a c értékét.
B3. Karaktersorozat-kezelő függvények: a <string.h> header
A karaktersorozatot kezelő függvényeknek két csoportja van deklarálva a<string.h>headerben. Az első csoportba tartozó függvények neve azstrkarakterekkel kezdődik, a második csoportba tartozóké pedig amemkarakterekkel. Amemmovefüggvény kivételével a függvények viselkedése definiálatlan, ha átfedő objektumokra alkalmazzuk azokat. Az összehasonlító függvények az argumentumukatunsignedchartípusú tömbként kezelik.
A következő táblázatbanséstchar*típusú,csésctconstchar*típusú,nsize_ttípusú, valamintcchartípusra konvertáltinttípusú.
char*strcpy(s, ct)
Azstrcpyfüggvény actkaraktersorozatot átmásolja az s karaktersorozatba, beleértve act-t záró‘\0‘végjelet is. A függvény visszatérési értéke s mutatója.
char*strncpy(s, ct, n)
Azstrncpyfüggvény act-bőlnkaraktert átmásols-be és visszatérsmutatójával. Azsvégét‘\0‘végjelekkel tölti fel, hactnkarakternél rövidebb volt.
char*strcat(s, ct)
Azstrcatfüggvény actkaraktersorozatot azskaraktersorozat végéhez fűzi (konkatenálja) és visszatérsmutatójával.
char*strncat(s, ct, n)
Azstrncatfüggvény actkaraktersorozatbólnkaraktert azskaraktersorozat végéhez fűz,s-t lezárja a‘\0‘végjellel és visszatérsmutatójával.
intstrcmp(cs, ct)
Azstrcmpfüggvény összehasonlítja acskaraktersorozatot actkaraktersorozattal és visszatér negatív értékkel, hacs < ct, nulla értékkel, hacs == ctés pozitív értékkel, hacs > ct.
intstrncmp(cs, ct, n)
Azstrncmpfüggvény összehasonlítja acskaraktersorozat legfeljebbnkarakterét actkaraktersorozattal és visszatér negatív értékkel, hacs < ct, nulla értékkel, hacs == ctés pozitív értékkel, hacs > ct.
char*strchr(cs, c)
Azstrchrfüggvény ackaraktercs-beli első előfordulási helyének mutatójával, ill. hacnem található megcs-ben, akkorNULLértékű mutatóval tér vissza.
char*strrchr(cs, c)
Azstrrchrfüggvény ackaraktercs-beli utolsó előfordulási helyének mutatójával, ill. hacnem található megcs-ben, akkorNULLértékű mutatóval tér vissza.
size_tstrspn(cs, ct)
Azstrspnfüggvény visszatérési értéke acskaraktersorozat elejéről vett ésct-ben megtalálható részsorozat hossza. (Az elején egyező rész hossza.)
size_tstrcspn(cs, ct)
Azstrcspnfüggvény visszatérési értéke acskaraktersorozat elejéről vett ésct-ben nem megtalálható részsorozat hossza. (Az elején különböző rész hossza.)
char*strpbrk(cs, ct)
Azstrpbrkfüggvény visszatérési értéke acskaraktersorozatctkaraktersorozaton belüli első előfordulásának kezdetét címző mutató, vagyNULL, hacsnem található megct-ben.
char*strstr(cs, ct)
Azstrstrfüggvény visszatérési értéke actkaraktersorozatcs-beli első előfordulásának kezdetét címző mutató, vagyNULL, ha actnem található megcs-ben.
size_tstrlen(cs)
Azstrlenfüggvény visszatérési értéke acskaraktersorozat hossza.
char*strerror(n)
Azstrerrorfüggvény aznhibaszámhoz tartozó, a gépi megvalósítástól függő hibaüzenet karaktersorozatának mutatójával tér vissza.
char*strtok(s, ct)
Azstrtokfüggvény megkeresi azskaraktersorozatban actkaraktersorozatból vett karakterekkel határolt tokeneket. (A függvény működésének leírását l. alább.)
Azstrtok(s, ct)függvény sorozatos hívásával azskaraktersorozat tokenekre bontható és az egyes tokeneket act-ben lévő karakter határolja. A függvény első hívásának s nemNULLértékével kell történnie, és ekkor a függvény megkeresi azs-ben az első,ct-ben nem lévő karakterekből felépített tokent, majd azskövetkező karakterét a‘\0‘végjellel felülírva visszatér a tokent címző mutatóval. A további hívásokat azsNULLértéke jelzi, és a függvény ilyenkor a következő token (amelyet az előzőleg talált token végétől kezd keresni) mutatójával tér vissza. Ha azstrtoknem talál további tokent, akkor a visszatérési értékeNULLlesz. Actkaraktersorozat hívásról hívásra változhat.Amemkezdetű függvények különböző objektumokkal mint karakteres tömbökkel való manipulációkra használhatók, és megírásukkal a hatékony adatkezelő eljárások kialakítása volt a cél. A következő táblázatbanséstvoid*típusú,csésctconstvoid*típusú,nsize_ttípusú, valamintcunsignedchartípusúvá alakítottinttípusú.
void*memcpy(s, ct, n)
Amemcpyfüggvény act-bőlnkaraktert átmásol azs-be és visszatérsmutatójával.
void*memmove(s, ct, n)
Amemmovefüggvény megegyezik amemcpyfüggvénnyel, kivéve, hogy egymást átfedő objektumok esetén is használható.
intmemcmp(cs, ct, n)
Amemcmpfüggvény összehasonlítja acselsőnkarakterétct-vel. A függvény visszatérési értékei megegyeznek azstrcmpvisszatérési értékeivel.
void*memchr(cs, c, n)
Amemchrfüggvény visszatérési értéke ackaraktercs-beli első előfordulásának helyét címző mutató, vagyNULL, hacnem található megcselsőnkarakterében.
void*memset(s, c, n)
Amemsetfüggvény elhelyezi ackaraktert azselsőnkarakterében és visszatérési értéke azsmutatója.
B4. Matematikai függvények: a <math.h> header
A matematikai eljárások függvényei és makrói a<math.h>headerben vannak deklarálva.Az<errno.h>headerben deklaráltEDOMésERANGEnem nulla értékű egész állandók, amelyek a függvények értelmezési tartomány és értékkészlet hibáját jelzik, aHUGE_VALértéke pedig pozitív,doubletípusú szám. Az értelmezési tartomány hiba akkor fordul elő, ha a függvény argumentuma a függvénydefinícióban megadott tartományon kívülre esik. Az értelmezési tartomány hiba esetén azerrnobeállEDOMértékére és a visszatérési érték (a hibaüzenet) a gépi megvalósítástól függ. Az értékkészlet hiba akkor fordul elő, ha a függvénnyel kapott eredmény nem ábrázolhatódoubletípusú változóval. Ha az eredmény túlcsordult, akkor a függvény visszatérésekor a helyes előjelnek megfelelően állítja be aHUGE_VAL-t és azerrnoazERANGEértékének megfelelően áll be. Ha az eredmény alácsordult, akkor a függvény nulla értékkel tér vissza és azerrnoa gépi megvalósítástól függő módon áll beERANGEértékére.
A függvények leírását tartalmazó táblázatbanxésydoubletípusú,nértékeinttípusú, és minden függvény visszatérési értékedoubletípusú. A trigonometrikus függvények argumentumát radiánban kell megadni. A matematikai függvények:
| sin(x) | az x argumentum szinusza; |
| cos(x) | az x argumentum koszinusza; |
| tan(x) | az x argumentum tangense; |
| asin(x) | azxargumentum árkusz szinusza, az értékkészlet a [-π/2, π/2] tartomány, x E [-1, 1]; |
| acos(x) | az x argumentum árkusz koszinusza, az értékkészlet a [0, π] tartomány, x E [-1, 1]; |
| atan(x) | az x argumentum árkusz tangense, az értékkészlet a [-π/2, π/2] tartomány; |
| atan2(y, x) | az y/x érték árkusz tangense, az értékkészlet a [-π, π] tartomány; |
| sinh(x) | az x argumentum szinusz hiperbolikusa; |
| cosh(x) | az x argumentum koszinusz hiperbolikusa; |
| tanh(x) | az x argumentum tangens hiperbolikusa; |
| exp(x) | az exexponenciális függvény; |
| log(x) | az x argumentum természetes alapú logaritmusa (ln(x))), x>0; |
| log10(x) | az x argumentum tízes alapú logaritmusa (lg(x))), x>0; |
| pow(x, y) | az xyalakú hatványfüggvény, értelmezési tartomány hiba lép fel, ha x=0 és y<0, vagy ha x<0 és y értéke nem egész szám; |
| sqrt(x) | az x argumentum négyzetgyöke, x>0; |
| ceil(x) | az x argumentumnál nem kisebb legkisebb egész szám,doubletípusra konvertálva; |
| floor(x) | az x argumentumnál nem nagyobb legnagyobb egész szám,doubletípusra konvertálva; |
| fabs(x) | az x argumentum abszolút értéke (|x|); |
| ldexp(x, n) | az x*2nfüggvény értéke; |
| frexp(x,int*exp) | a függvény az x argumentum értékét az [1/2, 1) intervallumba eső normált törtrésszé alakítja és ezzel az értékkel tér vissza. A 2 hatványaként értelmezett kitevő a *exp című változóba tárolódik. Ha x=0, akkor az eredmény törtrésze és kitevője egyaránt nulla lesz; |
| modf(x,double*ip) | az x argumentum eredeti x előjelével azonos előjelű egész- és törtrészre bontása. Az egészrész az *ip című változóban tárolódik, a függvény visszatérési értéke a törtrész lesz; |
| fmod(x, y) | az x/y lebegőpontos osztás lebegőpontos maradéka, ami ugyanolyan előjelű mint x. Ha y=0, akor az eredmény a gépi megvalósítástól függ. |
B5. Kiegészítő rendszerfüggvények: az <stdlib.h> header
Az<stdlib.h>standard headerben vannak deklarálva a számkonverziós, tárkezelő és más hasonló, általános jellegű függvények. Az egyes függvények leírása:
doubleatof(constchar*s)
Azatoffüggvény azskaraktersorozat tartalmátdoubletípusú számmá alakítja. A függvény egyenértékű azstrtod(s, (char**)NULL, 10)függvénnyel.
intatoi(constchar*s)
Azatoifüggvény azskaraktersorozat tartalmátinttípusú számmá alakítja. A függvény egyenértékű az(int)strtol(s, (char**)NULL, 10)függvénnyel.
longatol(constchar*s)
Azatolfüggvény azskaraktersorozat tartalmátlongtípusú számmá alakítja. A függvény egyenértékű azstrtol(s, (char**)NULL, 10)függvénnyel.
doublestrtod(constchar*s,char**endp)
Azstrtodfüggvény azskaraktersorozatot a bevezető üreshely-karakterek elhagyása után egydoubletípusú előtaggá (amely a függvény visszatérési értéke lesz), valamint egy konvertálatlan utótaggá (kivéve, ha*endpértékeNULL) alakítja. Az utótagot címző mutató a*endphelyen tárolódik. Ha az eredmény túlcsordul, akkor aHUGE_VALa helyes előjelnek megfelelő értéket veszi fel; ha az eredmény alácsordul, akkor a visszatérési érték nulla lesz. Azerrnomindkét esetben azERANGEértékére áll be.
longstrtol(constchar*s,char**endp,intalap)
Azstrtolfüggvény azskaraktersorozatot a bevezető üreshely-karakterek elhagyása után egylongtípusú előtaggá (amely a függvény visszatérési értéke lesz), valamint egy konvertálatlan utótaggá (kivéve, ha*endpértékeNULL) alakítja. Ha azalapargumentum értéke 2 és 36 közé esik, akkor a konverzió úgy megy végbe, hogy feltételezi a bemeneti adat adott számrendszerbeli ábrázolását. Ha azalapnulla értékű, akkor az átalakítás oktális, decimális vagy hexadecimális számrendszerbe történik, a bemeneti adat írásmódjától függően (ha a számjegykarakterek sorozata0karakterrel kezdődik, akkor oktális, ha pedig0xvagy0Xkarakterekkel, akkor hexadecimális szám lesz az eredmény). A karaktersorozatban szereplő betűk minden esetben a10és az(alap – 1)közötti számjegyeket jelölik; a hexadecimális számoknál megengedett a bevezető0xvagy0X. Az utótagot címző mutató a*endphelyen tárolódik. Ha az eredmény túlcsordul, akkor a függvény visszatérési értéke az eredmény előjelétől függőenLONG_MAXvagyLONG_MINés azerrnoazERANGEértékére áll be.
unsignedlongstrtoul(constchar*s,char**endp,intalap)
Azstrtoulfüggvény megegyezik azstrtolfüggvénnyel, kivéve, hogy az eredmény (visszatérési érték)unsignedlongtípusú és túlcsordulás esetén a visszatérési értékULONG_MAXértékű.
intrand(void)
Arandfüggvény egy0ésRAND_MAXközötti pszeudovéletlen egész számmal tér vissza.RAND_MAXértéke legalább32 767.
voidsrand(unsignedintindul)
Azsrandfüggvény azindulértékével egy új pszeudovéletlen számsorozatot generál. A véletlenszám-generátor, kezdeti induló értéke 1.
void*calloc(size_tnobj,size_tmeret)
Acallocfüggvény egynobjszámú, egyenkéntmeretméretű objektumot tartalmazó tömb számára lefoglalt tárterület kezdetét címző mutatóval tér vissza. A mutató értékeNULL, ha a helyfoglalási igény nem elégíthető ki. A lefoglalt tárterület nulla értékű bájtokkal van feltöltve.
void*malloc(size_tmeret)
Amallocfüggvény egyetlenmeretméretű objektum számára lefoglalt tárterület kezdetét címző mutatóval, vagy ha az igény nem elégíthető ki, akkorNULLértékkel tér vissza. A lefoglalt tárterület inicializálatlan.
void*realloc(void*p,size_tmeret)
Areallocfüggvény apmutatóval címzett objektum méretétmeret-re változtatja. Az objektum tartalma a régi és új méretek közül a kisebb méretig változatlan marad. Ha az új méret nagyobb a réginél, akkor az új tárterület mutatójával tér vissza, ill. aNULLértékkel, ha az igény nem elégíthető ki (ilyenkor*pváltozatlan marad).
voidfree(void*p)
Afreefüggvény felszabadítja acalloc,mallocvagyreallocfüggvényekkel lefoglalt, apmutatóval címzett tárterületet. HapértékeNULL, akkor a függvény nem csinál semmit.
voidabort(void)
Azabortfüggvény a program futásának abnormális befejezését okozza. A függvény működése megegyezik araise(SIGABRT)függvényhívás működésével.
voidexit(intallapot)
Azexitfüggvény a program futásának normális befejezését okozza. Azatexitfüggvény hívásával kiüríti a megnyitott állományok puffereit, lezárja a megnyitott adatáramokat és a vezérlést visszaadja az operációs rendszernek. Az operációs rendszernek visszaadott állapot állapotjelzés értelmezése a gépi megvalósítástól függ, de a nulla érték mindig a normális (sikeres) befejezést jelenti. Az állapotEXIT_SUCCESSésEXIT_FAILUREértéke szintén használható.
intatexit(void(*fcn)(void))
Azatexitfüggvény végrehajtásra előjegyzi azfcnfüggvényt a program normális befejezése esetén. A függvény nem nulla értékkel tér vissza, ha az előjegyzés nem hajtható végre.
intsystem(constchar*s)
Asystemfüggvény végrehajtásra átadja az operációs rendszernek az s karaktersorozatot. HasértékeNULL, akkor a függvény nem nulla értékkel tér vissza létező parancsprocesszor esetén. Hasértéke nemNULL, akkor a függvény visszatérési értéke a gépi megvalósítástól függ.
char*getenv(constchar*nev)
Agetenvfüggvény visszatérési értéke az operációs rendszertől kapottnevnevű karaktersorozat vagyNULL, ha nincs karaktersorozat. A függvény működésének részletei a gépi megvalósítástól függenek.
void*bsearch(constvoid*kulcs,constvoid*tabla,size_tn,size_tmeret,int(*comp) (constvoid*kulcsv,constvoid*datum))
Absearchfüggvény atabla[0]…tabla[n-1]táblázat elemei (amelyek méretemeret) közül megkeresi akulcs-csal megegyezőt. Absearchfüggvény az összehasonlításhoz acmpfüggvényt használja, amely negatív értékkel tér vissza, ha az első argumentuma kisebb a másodiknál, nullával, ha a két argumentum megegyezik és pozitív értékkel, ha az első argumentum nagyobb a másodiknál. (Az első argumentum akulcs, a második a táblázat megfelelő eleme.) Atablatömb elemeinek növekvő sorrendbe rendezettnek kell lenni. Absearchfüggvény akulcs-csal megegyező elem mutatójával, ill. ha akulcs-nak megfelelő elem nem található meg a tömbben, akkorNULLértékkel tér vissza.
voidqsort(void*tabla,size_tn,size_tmeret,int(*cmp) (constvoid*,constvoid*))
Aqsortfüggvény növekvő sorrendbe rendezi atabla[0]…tabla[n-1]meretméretű objektumokból álló tömböt. Az összehasonlítást absearchfüggvénynél alkalmazottcmpfüggvény végzi.
intabs(intn)
Azabsfüggvény visszatérési értéke az egész típusú argumentumának abszolút értéke (egész értékként).
longlabs(longn)
Alabsfüggvénylongtípusú vissztérési értéke alongtípusú argumentum abszolút értéke.
div_tdiv(intszaml,intnevez)
Adivfüggvény kiszámítja az egész típusú argumentumokra felírtszaml/neveztört hányadosát és maradékát. Az eredmény egydiv_ttípusú struktúraquotésremnevű,inttípusú tagjaiban tárolódik (aquota hányadost,rema maradékot tárolja).
ldiv_tldiv(longszaml,longnevez)
Azldivfüggvény kiszámítja alongtípusú argumentumokra felírtszaml/neveztört hányadosát és maradékát. Az eredmény egyldiv_ttípusú struktúralongtípusú,quotésremnevű tagjaiban tárolódik (aquota hányadost,rema maradékot tárolja).
B6. Programdiagnosztika: az <assert.h> header
Azassertmakró a programdiagnosztika segítésére használható. A makró általános formája:
void assert(int kifejezés)
A makrót az
assert(kifejezés)
formában híva az azstderrállományba az
Assertion failed: kifejezés, file állománynév, line nnn
üzenetet fogja kiírni. Ezután hívható azabortfüggvény, amellyel a program futása befejezhető. Az üzenetben szereplő állománynevet és sorszámot azassertaz előfeldolgozó rendszerben definiált és kezelt__FILE__és__LINE__azonosítójú helyekről veszi. Ha az<assert.h>header beépítésekor azNDEBUGnév definiálva van, akkor azassertmakrót a rendszer figyelmen kívül hagyja (nem hajtja végre).
B7. Változó hosszúságú argumentumlisták kezelése: az <stdarg.h> header
Az<stdarg.h>headerben definiált függvények és változók lehetővé teszik ismeretlen számú és típusú argumentumot tartalmazó függvényhívás argumentumlistájának feldolgozását.Tételezzük fel, hogy af(a1, a2, utarg, …)alakú függvényhívásbanutargaz utolsó névvel ellátott argumentum, amelyet már a változó argumentumrész követ. Ekkor azffüggvényhez
va_list ap;
formában deklarálható egyva_listtípusúapváltozó (argumentummutató), amely az egyes argumentumokat címzi. Azapmutatót az első meg nem nevezett argumentumhoz való hozzáférés előtt ava_startmakróval a
va_start(va_list ap, utarg);
módon inicializálni kell. Ezek után ava_argmakró hívásával vehető elő a lista következő, meg nem nevezett argumentuma. Ava_argmakró a
típus va_arg(va_list ap, típus);
formában hívható, és visszatérési értéke azapáltal címzett argumentum értéke a megadott típusra konvertálva. A hívás során ava_argmakró azapmutatót a következő meg nem nevezett argumentumra lépteti. Azffüggvényben az argumentumlista feldolgozása után, de még a függvényből való visszatérés előtt egyszer hívni kell ava_endmakrót a
void va_end(va_list ap);
formában, ami lezárja az argumentumlista feldolgozását.
B8. Nem lokális vezérlésátadások: a <setjmp.h> header
A<setjmp.h>header deklarációi lehetőséget nyújtanak a normális függvényhívások és visszatérések elkerülésére, és tipikusan lehetővé teszik, hogy mélyen beágyazott függvényhívásokból közvetlenül térjünk vissza. Az egyes makrók:
intsetjmp(jmp_bufenv)
Asetjmpmakró azenvváltozóba elmenti az állapotinformációt. Az elmentett információ alongjmpmakró hívásakor használható fel. Asetjmpmakrót közvetlenül híva a visszatérési értéke nulla. Ha asetjmp-ot a soron következőlongjmpmakró hívta, akkor a visszatérési értéke nem nulla. Asetjmphívása csak meghatározott programkörnyezetekben fordulhat elő, alapvetően aswitch,ifutasítások, ill. ciklusok ellenőrző részében és csak egyszerű relációs kifejezésekben. Asetjmphasználatát a következő programrészlet szemlélteti:
if (setjmp(env) == 0) /* a setjmp közvetlen hívása */ else /* itt következik a longjmp-on keresztüli setjmp hívás */
voidlongjmp(jmp_bufenv,intert)
Alongjmpmakró helyreállítja a korábbisetjmpmakró hívásával elmentett,envváltozóban lévő állapotot, majd a végrehajtás úgy folytatódik, mintha egysetjmpmakrót hajtanánk végre és a visszatérés egy nem nullaertértékkel történik. Alongjmpmakróban lévősetjmphívás nincs lezárva. Alongjmphívásakor értéket kapott objektumok értéke hozzáférhető marad, kivéve asetjmphívásakor érvényben lévő nemvolatileautomatikus tárolási osztályú változókat, amelyek definiálatlanná válnak, ha az értékük asetjmphívása után megváltozott.
B9. Jelzések kezelése: a <signal.h> header
A<signal.h>header lehetőséget nyújt a program végrehajtása során előforduló váratlan események, mint pl. külső forrástól érkező megszakításkérés, végrehajtási hiba stb., kezelésére. Az eseményt kezelő függvény általános alakja:
void(*signal (intsig,void(*handler) (int))) (int)
Asignalfüggvény meghatározza, hogy a rendszer a soron következő jelzést hogyan fogja kezelni. Hahandler-nek aSIG_DFLlett megadva, akkor a gépi megvalósításban meghatározott alapfeltételezés szerinti kezelést végez, ha pedig aSIG_IGNlett megadva, akkor a jelzést figyelmen kívül hagyja. Minden más esetben ahandler-ben megadott, a jelzés típusának megfelelő argumentummal hívott függvény végzi a jelzés kezelését. A megengedettsigjelzések:
SIGABRT program abnormális befejezése, pl. azabortfüggvénytől kapott jelzés; SIGFPE aritmetikai hiba, pl. nullával való osztás vagy túlcsordulás; SIGILL illegális függvényhívás, pl. illegális utasítás; SIGINT interaktív jelzés, pl. megszakításkérés; SIGSEGV illegális tároló-hozzáférés, pl. címzés a tárhatáron kívülre; SIGTERM lezárási igény küldése a programhoz. Asignalfüggvény a megadott jelzéshez tartozó handler előző értékével vagy hiba esetén aSIG_ERRértékkel tér vissza. Amikor asigjelzés bekövetkezik, akkor asignalfüggvény alapállapotba áll vissza, majd(*handler)(sig)formában létrejön a jelzést kezelő függvény hívása. A jelzést kezelő függvényből való visszatérés után a program végrehajtása ott folytatódik, ahol a jelzés megjelenésekor félbeszakadt. A jelzések kezdeti állapota a gépi megvalósítástól függ.
intraise(intsig)
Araisefüggvény asigargumentummal megadott jelzést küldi a programnak. Ha a jelzés átadása sikertelen volt, akkor a visszatérési értéke nem nulla.
B10. Dátumot és időt kezelő függvények: a <time.h> header
A <time.h> headerben vannak deklarálva a dátummal és idővel kapcsolatos műveletekhez szükséges adattípusok és függvények. Néhány függvény a helyi időt dolgozza fel, amely különbözhet a naptári időtől, pl. más időzóna miatt. Aclock_téstime_taz idő ábrázolására alkalmas aritmetikai adattípusok, és astructtma naptári idő komponenseit tartalmazza a következő felosztásban:
| inttm_sec; | a percet követő másodpercek, 0-tól 61-ig; |
| inttm_min; | az órát követő percek, 0-tól 59-ig; |
| inttm_hour; | az éjféltől eltelt órák száma, 0-tól 23-ig; |
| inttm_mday; | a hónap napja, 1-től 31-ig; |
| inttm_mon; | a január óta eltelt hónapok, 0-tól 11-ig; |
| inttm_year; | az évszám 1900 óta; |
| inttm_wday; | a napok vasárnap óta, 0-tól 6-ig; |
| inttm_yday; | a január 1. óta eltelt napok száma, 0-tól 365-ig; |
| inttm_isdst; | óraátállítás-jelző. |
Atm_isdstpozitív, ha az óraátállítás érvényben van, nulla ha nincs érvényben és negatív, ha az erre vonatkozó információ nem áll a rendelkezésünkre.
A dátumot és időt kezelő függvények:
clock_tclock(void)
Aclockfüggvény visszatérési értéke a program kezdete óta eltelt processzoridő, vagy ha ez nem áll rendelkezésünkre, akkor a -1 érték. A processzoridő aclock() /CLOCKS_PER_SECösszefüggéssel számolható át másodpercre.
time_ttime(time_t*tp)
Atimefüggvény visszatérési értéke az aktuális naptári idő, vagy -1, ha az nem áll a rendelkezésünkre. HatpnemNULLértékű, akkor a visszatérési érték a*tphelyen is eltárolódik.
doubledifftime(time_ttime2,time_ttime1)
Adifftimefüggvény visszatérési értéke atime2 – time1különbség másodpercben kifejezve.
time_tmktime(structtm *tp)
Azmktimefüggvény a struktúra*tphelyén lévő helyi időt atimefüggvénynek megfelelő ábrázolású naptári idővé alakítja. Az idő egyes komponensei a leírtak szerinti tartományba fognak esni. A függvény visszatérési értéke a naptári idő, vagy -1, ha az nem ábrázolható a megfelelő formában.
A következő négy függvény statikus objektumhoz tartozó mutatóval tér vissza és ezek az objektumok más függvényhívásokkal felülírhatók.
char*asctime(conststructtm *tp)
Azasctimefüggvény a*tpstrutúrában található naptári időt a
Sun Jan 3 15:14:13 1994\n\0alakú karaktersorozattá alakítja.
char*ctime(consttime_t*tp)
Actimefüggvény a*tpcímen lévő naptári időt helyi idővé alakítja. A függvény egyenértékű azasctime(localtime(tp))függvényhívással.
structtm *gmtime(consttime_t*tp)
Agmtimefüggvény a*tpcímen lévő naptári időt a koordinált univerzális idővé (UTC) alakítja. A függvényNULLértékkel tér vissza, ha az UTC nem áll rendelkezésre. Agmtimeelnevezés történeti okokra vezethető vissza.
structtm *localtime(consttime_t*tp)
Alocaltimefüggvény a*tpcímen található naptári időt helyi idővé lakítja.
size_tstrftime(char*s,size_tsmax,constchar*fmt)
Azstrftimefüggvény a*tphelyen található dátum- és időadatokat azfmtformátum szerint karaktersorozattá alakítja és elhelyezi azskaraktersorozatban. Azfmtformátumleírás megegyezik aprintffüggvény formátumleírásával. A formátumleírásban lévő közönséges karakterek (beleértve a lezáró‘\0‘karaktert is) átmásolódnak az s karaktersorozatba, a%calakú elemek pedig a következőkben leírtak szerint, a helyi operációs rendszer megfelelő értékeit felhasználva helyettesítődnek. Azskaraktersorozatban legfeljebbsmaxszámú karakter helyezhető el. Azstrftimefüggvény visszatérési értéke azs-ben elhelyezett karakterek száma (beleértve a lezáró‘\0‘karaktert is), vagy nulla, hasmax-nál több karaktert kívántunk elhelyezni. A%calakú formátumspecifikációk:
%a a nap neve, rövidítve; %A a nap neve, teljesen kiírva; %b a hónap neve, rövidítve; %B a hónap neve, teljesen kiírva; %c helyidátum- és helyiidő-ábrázolás; %d a hónap napja számmal (01…31); %H az óra (24 órás kiírás, 00…23); %I az óra (12 órás kiírás, 01…12); %j az év napja számmal (001…365); %m a hónap számmal (01…12); %M a perc (00…59); %p az AM vagy PM helyi megfelelője (pl. de vagy du); %S a másodperc (00…61); %U a hét sorszáma az évben (a hét első napjának a vasárnapot tekintve, 00…53); %w a hét napja számmal (vasárnap a 0., 0…6); %W a nap sorszáma az évben (a hét első napjának hétfőt tekintve, 000…365); %x helyidátum ábrázolás; %X helyiidő-ábrázolás; %y az évszám, évszázad nélkül (00…99); %Y az évszám évszázaddal; %Z az időzóna elnevezése, ha van; %% % jel.
B11. A gépi megvalósításban definiált határértékek: a <limits.h> és <float.h> headerek
A<climits.h>headerben vannak az egész típusú adatok méreteit megadó állandók definiálva. Az itt megadott értékek a szabvány szerint szóba jöhető minimális nagyságot jelentik, ezeknél nagyobb értékek is használhatók az egyes gépi megvalósításokban.
| Azonosító | Érték | Jelentés |
| CHAR_BIT | 8 | a bitek min. száma egychartípusú változóban |
| CHAR_MAX | UCHAR_MAXvagySCHAR_MAX | egychartípusú változóban tárolható max. érték |
| CHAR_MIN | 0vagySCHAR_MIN | egychartípusú változóban tárolható min. érték |
| INT_MAX | +32767 | egyinttípusú változóban tárolható max. érték |
| INT_MIN | -32767 | egyinttípusú változóban tárolható min. érték |
| LONG_MAX | +2147483647 | egylongtípusú változóban tárolható max. érték |
| LONG_MIN | -2147483647 | egylongtípusú változóban tárolható min. érték |
| SCHAR_MAX | +127 | egysignedchartípusú változóban tárolható max. érték |
| SCHAR_MIN | -127 | egysignedchartípusú változóban tárolható min. érték |
| SHRT_MAX | +32767 | egyshorttípusú változóban tárolható max. érték |
| SHRT_MIN | -32767 | egyshorttípusú változóban tárolható min. érték |
| UCHAR_MAX | 255 | egyunsignedchartípusú változóban tárolható max. érték |
| UINT_MAX | 65535 | egyunsignedinttípusú változóban tárolható max. érték |
| ULONG_MAX | 4294967295 | egyunsignedlongtípusú változóban tárolható max. érték |
| USHRT_MAX | 65535 | egyunsignedshorttípusú változóban tárolható max. érték |
A következő táblázat a<float.h>headerben definiált, a lebegőpontos aritmetikával kapcsolatos állandók egy részét tartalmazza. A megadott értékek itt is a szabvány szerinti minimumot jelentik, az egyes gépi megvalósítások más, ennél nagyobb értéket is megengedhetnek.
| Azonosító | Érték | Jelentés |
| FLT_RADIX | 2 | a lebegőpontos számábrázolásban a számrendszer alapszáma |
| FLT_ROUNDS | lebegőpontos kerekítési mód összeadásra | |
| FLT_DIG | 6 | floattípusú szám decimális számjegyekben mért pontossága |
| FLT_EPSILON | 1E-5 | az a legkisebbfloattípusúxszám, amelyre1.0+x != 1.0 |
| FLT_MANT_DIG | azFLT_RADIXszámrendszerű ábrázolásban a mantissza számjegyeinek száma | |
| FLT_MAX | 1E+37 | egyfloattípusú lebegőpontos szám max. értéke |
| FLT_MAX_EXP | az a max.nszám, amelyre azFLT_RADIXn-1még ábrázolható | |
| FLT_MIN | 1E-37 | egy normálfloattípusú lebegőpontos szám min. értéke |
| FLT+MIN+EXP | az a min.nszám, amelyre10negy normált számot ad | |
| DBL_DIG | 10 | doubletípusú szám decimális számjegyekben mért pontossága |
| DBL_EPSILON | az a legkisebbdoubletípusúxszám, amelyre1.0+x != 1.0 | |
| DBL_MANT_DIG | azFLT_RADIXszámrendszerű ábrázolásban a mantissza számjegyeinek száma | |
| DBL_MAX | 1E+37 | egydoubletípusú lebegőpontos szám max. értéke |
| DBL_MAX_EXP | az a max.nszám, amelyre azFLT_RADIXn-1még ábrázolható | |
| DBL_MIN | 1E-37 | egy normáltdoubletípusú lebegőpontos szám min. értéke |
| DBL_MIN_EXP | az a min.nszám, amelyre10negy normált számot ad |
| A. FÜGGELÉK | Tartalom | C. FÜGGELÉK |





