Documente Academic
Documente Profesional
Documente Cultură
248
Biblioteca C standard cuprinde o mare varietate de func\ii, instrumente puternice =i eficiente ]n elaborarea programelor. O parte din aceste func\ii, cea mai uzual[, a fost deja prezentat[ de-a lungul lucr[rii. n continuare prezent[m prototipurile func\iilor standard C, mai importante, ]nso\ite de un scurt comentariu privind argumentele lor, valorile ]ntoarse =i efectul ac\iunii lor. !e poate face o clasificare a func\iilor C dup[ cum urmeaz[" func\ii pentru opera\ii de intrare#ie=ire func\ii pentru prelucrarea caracterelor func\ii pentru prelucrarea =irurilor de caractere func\ii pentru gestiunea memoriei $eap func\ii matematice func\ii pentru gestiunea timpului UNC|II PENTRU OPERA|II DE INTRARE/IE+IRE FUNC|II DESCHIDERE/}NCHIDERE FI+IER
FILE * fopen (const char * numefis, const char mod);
desc$ide fi=ierul cu numele numefis =i ]l asocieaz[ unui flu% identificat printr-un pointer. &odul de desc$idere este specificat de mod 'vezi Capitolul 10(. )ntoarce un pointer c[tre o structur[ *)+, dac[ opera\ia a avut succes =i un pointer de valoare -.++, dac[ opera\ia a e=uat.
int fclose(FILE *fp);
]nc$ide fi=ierul desc$is cu fopen(). /ointerul fp este pointerul fi=ier returnat la apelarea func\iei fopen(). FUNC|II CARE CONTROLEAZ{ INDICATORUL DE POZI|IE }N FI+IER
249
pozi\ioneaz[ indicatorul de pozi\ie ]n fi=ierul fp la valoarea specificat[ de origine la care se adaug[ deplasarea egal[ cu nr_octeti 'vezi Capitolul 10(.
int fgetpos(FILE *fp,long int *poz);
memoreaz[ valoarea curent[ a indicatorului de pozi\ie ] n obiectul indicat de poz. n caz de succes se ]ntoarce o valoare diferit[ de 0, iar ]n caz de eroare valoarea 0.
int fsetpos(FILE *fp,const long int *poz);
seteaz[ indicatorul de pozi\ie la valoarea *poz, ob\inut[ anterior cu func\ia fgetpos(). n caz de succes se ]ntoarce o valoare diferit[ de 0, iar ]n caz de eroare valoarea 0.
long ftell(FILE *fp);
]ntoarce o valoare diferit[ de 0 dac[ indicatorul de pozi\ie se afl[ la sf0r=itul fi=ierului =i 0 ]n caz contrar. FUNC|II PENTRU CITIREA +I SCRIEREA CARACTERELOR
int fgetc(FILE *fp);
]ntoarce valoarea caracterului c0nd opera\ia de citire din fi=ierul fp are succes sau ,O* c0nd s-a atins sf0r=itul fi=ierului sau a avut loc o eroare.
int fputc(int c,FILE *fp);
]ntoarce caracterul scris ]n fi=ierul fp, ]n caz de succes sau ,O* ]n caz de eroare.
int ungetc(int c,FILE *fp);
250
se repune un caracter ]n bufferul asociat fi=ierului fp. !e ]ntoarce c ]n caz de succes sau ,O* ]n caz de eroare.
int getc(FILE *fp);
este ec$ivalent[ cu fputc(int c,stdout)1 FUNC|II PENTRU CITIREA +I SCRIEREA +IRURILOR DE CARACTERE
char *fgets(char *str,int lg, FILE *fp);
cite=te din fi=ier un =ir de lungime cel mult lg ! caractere =i le transfer[ ]n =irul str. n caz de succes este ]ntoars[ adresa =irului str, iar ]n caz de eroare sau dac[ se atinge sf0r=it de fi=ier se ]ntoarce valoarea -.++.
int fputs(const char *sir, FILE *fp);
scrie ]n fi=ierul fp =irul precizat la adresa sir. n caz de succes ]ntoarce ultimul caracter scris, iar ]n caz de insucces ]ntoarce caracterul ,O*.
char *gets(char *sir);
cite=te un =ir de caractere de la tastatur[ =i ]l depune ]n sir. Caracterul #$n# nu se include ]n =ir =i se adaug[ terminatorul #$0#. *unc\ia ]ntoarce sir ]n caz de succes sau ,O* ]n caz de eroare.
int puts(const char *sir);
scrie =irul sir pe ecran ]ntorc0nd ultimul caracter scris sau ,O* ]n caz de eroare.
251
AT
]ntoarce num[rul de valori pentru care citirea, conversia =i memorarea datelor a fost f[cut[ corect. 2ac[ apare o eroare ]nainte de a ]ncepe citirea se ] ntoarce ,O*.
int scanf(const char *sir_format);
cite=te date din =irul de caractere sir conform formatului. 3alorile ]ntoarse de func\iile !"a#$%& =i !!"a#$%& sunt similare celor ]ntoarse de func\ia $!"a#$%&.
int fprintf(FILE *fp, const char *sir_format);
]ntoarce num[rul de caractere scrise efectiv sau o valoare negativ[ ]n caz de insucces.
int printf(const char *sir format);
scrie date conform formatului ]n =irul sir. !imilare cu func\iile $p'i#t$%&, p'i#t$%&, !p'i#t$%& sunt func\iile ($p'i#t$%&, (p'i#t$%& respectiv (!p'i#t$%& , pe care nu le prezent[m ]n aceast[ lucrare. /entru documentare se poate consulta [2].
252
cite=te din fi=ierul fp, n% blocuri, fiecare cu lungimea nr_oct =i le transfer[ ]n zona specificat[ de %uf. ntoarce num[rul de blocuri citite efectiv.
size_t f&rite(const "oid *%uf,size_t nr_oct, size_t n%, FILE *fp);
scrie ]n fi=ierul fp, n% blocuri preluate din zona specificat[ de %uf, fiecare bloc av0nd lungimea egal[ cu nr_octeti. !e ]ntoarce num[rul de blocuri scrise efectiv. FUNC|II PENTRU TESTAREA APARTENEN|EI LA CLASE DE CARACTERE /rototipurile acestor func\ii apar ]n fi=ierul antet 'ct(pe)h'. *unc\iile se aplic[ unui parametru de tip ] ntreg =i ]ntorc valori diferite de 0 dac[ e satisf[cut[ condi\ia de apartenen\[ =i 0 ]n caz contrar.
int isalnum(int c)1 testeaz[ dac[ c e alfanumeric int isalpha(int c)1 testeaz[ dac[ c e alfabetic int iscntrl(int c)1 testeaz[ dac[ c e caracter de control 'FF, *L, +,, -., /., 0EL, 01(1 int isdigit(int c)1 testeaz[ dac[ c este cifr[ zecimal[ int isgraph(int c)1 testeaz[ dac[ c este caracter grafic
f[r[ spa\iu
int islo&er(int c)1 testeaz[ dac[ c este litera mic[ int isprint(int c)1 testeaz[ dac[ c e caracter tip[ribil
inclusiv spa\iu int ispcmct(int c)1 testeaz[ dac[ c este caracter tip[ribil f[r[ spa\iu sau caracter alfanumeric
253
int isspace(int c)1 testeaz[ dac[ c este +,, FF, -., /., *L, spa\iu int isupper(int c)1 testeaz[ dac[ c este liter[ mare int is2digit(int c)1 testeaz[ dac[ c este cifr[ $e%azecimal[ '0-3, 4-F sau a-f(1
func\ii pentru citirea =i scriere =irurilor, prezentate deja 'care au prototipurile ]n stdio)h( func\ii cu prototipul in string)h 'copiere, comparare, concatenare, ini\ializare =iruri( func\ii de conversie a =irurilor 'cu prototipul in stdli%)h(
254
FUNC|II CU PROTOTIPUL IN STRIN*+H ,%ist[ dou[ categorii de func\ii" func\ii care se refer[ la =iruri care se termin[ prin #$0# =i func\ii ]n care =irurile sunt v[zute pur =i simplu ca tablouri de caractere 'f[r[ terminatorul #$0#(. Fu#",iil- "a'- !- '-$-'. la /i'u'i "u t-'0i#ato' \0 sunt"
char *strcat(char *sir!, const char *sir5);
caut[ c ]n =irul de caractere sir ]ntorc0nd ]n caz de succes pozi\ia lui, iar ]n caz contrar valoarea -.++.
int strcmp(const char sir!, const char sir5);
]ntoarce lungimea prefi%ului =irului sir! care nu con\ine nici unul din caracterele =irului sir5.
char *strerror(int er_cod);
]ntoarce un pointer c[tre un =ir ce reprezint[ un mesaj de eroare corespunz[tor codului er_cod.
size_t strlen(const char *sir);
255
compar[ cel mult nr caractere din sir! =i sir5 =i ] ntoarce valori la fel ca func\ia strcmp().
char *strncp((char *sir!, const char *sir5, size_t nr);
copiaz[ cel mult nr caractere din =irul sir5 ]n =irul sir! =i ]ntoarce sir!.
char *strp%rk(const char *sir!, const char *sir5);
]ntoarce un pointer la prima apari\ie ]n sir! a oric[rui caracter din sir5 sau -.++ dac[ nici un caracter din sir5 nu se afl[ ]n sir!.
char * strrchr(const char *sir, int c);
]ntoarce pointerul la ultima apari\ie a lui c ]n sir sau -.++ dac[ c nu apare ]n sir.
size_t strspn(const char *sir!, const char *sir5);
]ntoarce lungimea prefi%ului =irului sir! care con\ine numai elemente din sir5.
char *strstr(const char *sir!, const char *sir5);
]ntoarce un pointer la prima apari\ie ]n sir! a =irului sir5 sau -.++ dac[ sir5 nu este sub=ir al =irului sir!.
char *strtok(char *sir!, const char sir5);
caut[ ]n sir! sub=iruri delimitate de caractere din =irul sir5. U'0.toa'-l- $u#",ii !- '-$-'. la ta1lou'i 2"a'a"t-'- 'f[r[ a avea terminatorul #$0# ca la =iruri(.
"oid *memchr(const "oid *ta%lou, int c, size_t nr);
caut[ ]n tabloul indicat prin tablou, prima apari\ie a lui c printre cele nr caractere. ntoarce adresa lui ]n caz de succes sau -.++ ]n caz contrar.
256
compar[ ]n sens le%icografic primele nr caractere ale tablourilor ta%lou! =i ta%lou5. ntoarce un ]ntreg calculat ca la func\ia strcmp().
"oid *memcp(("oid *ta%lou!, const "oid *ta%lou5, size_t nr);
copiaz[ nr caractere din ta%lou5 ]n tabloul indicat de ta%lou!. 2ac[ tablourile se suprapun efectul este nedefinit.
"oid *memmo"e("oid *ta%lou!, const "oid *ta%lou5, size_t nr);
copiaz[ c 'octetul s[u inferior( ]n primele nr caractere ale tabloului ta%lou. FUNC|II DE CON3ERSIE A +IRURILOR .rm[toarele func\ii realizeaz[ conversii ale =irurilor de caractere ]n valori numerice.
dou%le atof(const char *str);
]ntoarce rezultatul conversiei =irului de caractere indicat de pointerul str la un num[r real. 6irul trebuie s[ con\in[ o valoare numeric[ scris[ corect, ]n caz contrar se ]ntoarce o valoare nedefinit[. 2elimitatorul final poate fi orice caracter diferit de punct =i de literele e sau E 'care intervin ]n mod natural ]n reprezentarea unui num[r ]n virgul[ mobil[(.
int atoi(const char *str);
257
]ntoarce rezultatul conversiei =irului de caractere indicat de pointerul str la un num[r ]ntreg. 6irul trebuie s[ con\in[ o valoare ]ntreag[ corect scris[, ]n caz contrar se ]ntorce o valoare nedefinit[. 2elimitatorul final poate fi orice caracter diferit de cifr[.
int atol(const char *str);
]ntoarce rezultatul conversiei =irului de caractere indicat de pointerul str la o valoare long int. 6irul trebuie s[ con\in[ o valoare ]ntreag[ valid[, ]n caz contrar se ]ntoarce o valoare nedefinit[. 2elimitatorul final poate fi orice caracter diferit de cifr[.
dou%le strtod(char *str, char **sf);
]ntoarce rezultatul conversiei =irului de caractere indicat de pointerul str la un num[r ]n format dou%le, ignor0nd spa\iile libere ini\iale. 6irul trebuie s[ con\in[ o valoare numeric[ corect scris[, ]n caz contrar se ] ntoarce valoarea zero. 2elimitatorul final poate fi orice caracter diferit de punct =i de literele e sau E. n *sf se depune pointerul la delimitatorul final din sir.
long strtol(const char *str, char **sf, int radi2);
]ntoarce rezultatul conversiei =irului de caractere indicat de pointerul str ignor0nd spa\iile libere ini\iale ] ntr-un num[r de tip long, reprezentat ]n baza de numera\ie stabilit[ de radi2. 2ac[ radi2 este zero se consider[ c[ baza este 9, !0 sau !: ]n caz contrar baza este dat[ de valoarea radi2 aflat[ obligatoriu ]ntre 5 =i ;:. 2elimitatorul poate fi orice caracter care nu poate intra ]n componen\a unui num[r ]ntreg. 2ac[ nu se poate realiza conversia se ]ntoarce valoarea zero. n *sf se depune pointerul la delimitatorul final din =ir.
unsigned long strtoul(const *start, char **sf, int radi2);
ac\ioneaz[ similar cu func\ia strtol() cu e%cep\ia faptului c[ ]ntoarce ]n caz de succes o valoare unsigned long.
258
ORIEI HEAP
aloc[ o zon[ compact[ din memoria $eap pentru un tablou av0nd nr elemente fiecare de lungime nr_oct octe\i. ntoarce un pointer c[tre primul octet al tabloului sau -.++ dac[ nu e%ist[ suficient[ memorie pentru alocare.
"oid *free("oid *ptr);
dealoc[ zona de memorie indicat[ de ptr, alocat[ anterior cu func\iile calloc(), malloc() sau realloc().
"oid *malloc(size_t nr_oct);
aloc[ o zon[ compact[ din memoria $eap de dimensiune nr_oct octe\i. ntoarce un pointer la primul octet din zona de memorie alocate sau -.++ dac[ nu e%ist[ spa\iu disponibil.
"oid *realloc("oid *ptr, size_t nr_oct);
realoc[ zona de memorie indicat[ de ptr 'alocat[ anteriror cu ajutorul func\iilor calloc() =i malloc()( la valoarea dat[ de nr_oct octe\i. ntoarce un pointer la zona realocat[ sau -.++ dac[ nu e%ist[ suficient spa\iu de memorie pentru alocarea celor nr_oct octe\i, situa\ie ]n care zona ini\ial[ de memorie r[m0ne nemodificat[.
259
UNC|II
ATE
ATICE
!tandardul 7-!) C define=te 55 func\ii matematice frecvent utilizate ]n programe. /rototipurile lor sunt con\inute de fi=ierul antet 'math)h'. 7rgumentele func\iilor sunt, cu mici e%cep\ii, de tip dou%le iar valorile ]ntoarse sunt de tip dou%le. /rincipalele erori care pot apare la apelul func\iilor sunt" -'oa'- 2- 2o0-#iu =i -'oa'- 2- '-p'-4-#ta'- . ,roarea de domeniu apare atunci c0nd argumentele func\iei sunt ]n afara domeniului s[u de defini\ie 'de e%emplu valori negative folosite drept argumente pentru func\ia logaritm(, iar eroarea de reprezentare apare atunci c0nd rezultatul ]ntors de func\ie nu poate fi reprezentat. 7ceste erori provoac[ setarea variabilei globale incorporate errno la valorile ,2O& respectiv ,87-9,. Cele dou[ macrocomenzi sunt definite ]n fi=ierul antet 'errno)h'. n situa\iile de eroare descrise se ]ntoarce o valoare definit[ la implementare, ]n cazul erorii de domeniu =i respectiv valoarea :.9,;37+ 'o valoare <mare= definit[ ]n fi=ierul antet 'math)h'( ]n cazul erorii de reprezentare. 7rgumentele func\iilor trigonometrice care sunt ung$iuri sunt considerate ]n radiani.
dou%le dou%le dou%le dou%le dou%le dou%le dou%le dou%le dou%le dou%le dou%le acos(dou%le 2); arccos de 2 asin(dou%le 2); arcsinus de 2 atan(dou%le 2); arctangent[ de 2 atan5(dou%le (,dou%le 2); arctangent[ de (<2 ceil(dou%le 2); cel mai mic ]ntreg 87 2 cos(dou%le 2); cosinus de 2 cosh(dou%le 2); cosinus $iperbolic de 2 e2p(dou%le 2); e%ponen\ial[ e la 2 fa%s(dou%le 2); valoarea absolut[ a lui 2 floor(dou%le 2); cel mai mare ]ntreg 67 2 fmod(dou%le 2,int (); restul ]mp[r\irii lui 2 la ( v[zu\i ca ]ntregi '2 modulo ((
260
memoreaz[ valoarea e%ponentului ]n e2p astfel ]nc0t 27mantisa*5e2p 'mantisa e cuprins[ ]ntre 0)= =i !(. dou%le lde2p(dou%le 2,int e2p); calculeaz[ 2*5e2p dou%le log(dou%le 2); calculeaz[ logaritm natural de 2 dou%le log!0(dou%le 2); calculeaz[ logaritm zecimal de
2 dou%le modf(dou%le 2,dou%le *pin); descompune un num[r 2 de tip dou%le ]n partea
dou%le
sa frac\ionar[ pe care o ]ntoarce =i partea ]ntreag[ pe care o memoreaz[ ]n pin po&(dou%le 2,dou%le (); ]ntoarce 2( pentru 2 =i ( apar\in0nd domeniul de defini\ie sin(dou%le 2); sinus de 2 sinh(dou%le 2); sinus $iperbolic de 2 s>rt(dou%le 2); r[d[cina p[trat[ a lui 2 tan(dou%le 2); tangent[ de 2 tanh(dou%le 2); tangent[ $iperbolic[ de 2
PULUI
/rototipurile func\iilor care gestioneaz[ timpul se g[sesc ]n fi=ierul $eader 'time)h'. 7cest $eader con\ine defini\iile a patru tipuri de date"
size_t, clock_t, time_t =i tm)
4ipul size_t reprezint[ un ]ntreg f[r[ semn. 4ipurile clock_t =i time_t se folosesc la reprezentarea orei =i a datei sistemului, ca date de tip long integer. !tructura standard de tip struct tm are alc[tuirea urm[toare"
struct tm
261
tm_sec;<* secunde 0)))=3 *< tm_min;<* minute 0)))=3 *< tm_hour;<* ore 0)))5; *< tm_mda(;<* ziua din luna !)));! *< tm_mon;<* luna 0)))!! *< tm_(ear;<* anul 87!300 *< tm_&da(;<* ziua saptamanii 0))): *< tm_(da(;<* ziua din an 0)));:= *< tm_isdst;<* indicator al orei de "ara este@ 80 daca functioneaza 70 daca nu functioneaza 60 daca nu e2ista informatii in domeniu *<
+ist[m mai jos prototipurile celor mai uzuale func\ii cuprinse ]n fi=ierul 'time)h'
char *asctime(const struct tm *ptr);
converte=te timpul din structura indicat[ de pointerul ptr ]ntr-un =ir de forma
zi luna data ore@minute@secunde an$n$0, unde
pointerul ptr este ob\inut cu ajutorul func\iei localtime() sau cu functia gmtime())
clock_t clock("oid);
ntoarce num[rul de impulsuri de ceas, efectuate o dat[ cu lansarea programului ]n e%ecu\ie. 4ransformarea ]n secunde se face ]mp[r\ind aceast[ valoare la macroul C+OC>!_/,8_!,C care d[ num[rul de b[t[i pe secund[ ale ceasului.
char *ctime(const time_t *ptr);
converte=te timpul de calendar din structura indicat[ de pointerul ptr ]ntr-un =ir de forma
zi luna data ore@minute@secunde an$n$0
/ointerul ptr este ob\inut cu ajutorul func\iei time(). ,a este ec$ivalent[ cu asctime(local(time))1
dou%le diff_time(time_t timp5, timp_t timp!);
262
converte=te timpul de calendar indicat de pointerul ptr ]n 4imp Coordonat .niversal '.niversal Coordinated 4ime( ]ntorc0nd un pointer la o structur[ de tip tm. 2ac[ nu este disponibil se ]ntoarce -.++. /ointerul ptr este ob\inut, printr-un apel al func\iei time().
struct tm *localtime(const time_t *ptr);
converte=te tipul de calendar indicat de pointerul ptr ] n timp local ]ntorc0nd un pointer la o structur[ de tip tm. 2ac[ nu e disponibil se ]ntoarce -.++. /ointerul ptr e ob\inut printr-un apel al func\iei time().
size_t strftime(char *sir, size_t dimma2, const char *sir_format, const struct tm *ptr);
converte=te datele din structura indicat[ de pointerul ptr ]n =irul sir, conform cu formatul sir_format.
time_t time(time_t *ptr);
]ntoarce ora curent[ calendaristic[ a sistemului sau B! dac[ nu e%ist[ aceast[ facilitate. !e poate apela cu ptr7*CLL sau cu o adres[ a unei variabile de tip time_t. n ultimul caz valoarea ] ntoars[ se atribuie de asemenea variabilei indicate de ptr. LTE FUNC|II UTILE
int a%s(int intr); <* fisier header stdli%)h *<
263
]ntoarce o structur[ de tip di"_t care con\ine c0tul =i restul ]mp[r\irii num[r[tor la numitor ]n membrii >uot, respectiv rem ai acestei structuri.
produce ie=irea dintr-un program =i revenirea ]n sistemul de operare. 2ac[ valoarea parametrului cod este 0 sau ,?)4_!.CC,! se indic[ terminarea cu succes a programului, iar dac[ este diferit de 0 sau ,?)4_*7)+.8, se indic[ terminarea cu eroare a programului.
int ferror(FILE fp); <* fisier header stdio)h *<
]ntoarce fie valoarea 0 indic0nd faptul c[ nu are loc o eroare sau o valoare diferit[ de 0 dac[ indicatorul de eroare asociat lui fp este pozi\ionat.
int fflush(FILE fp); <* fisier header stdio)h *<
gole=te %ufferul asociat unui fi=ier desc$is pentru scriere sau citire#scriere. ,fectul este nedefinit dac[ fi=ierul a fost desc$is numai pentru citire. ntoarce ,O* ]n caz de eroare sau 0 ]n caz normal.
long la%s(long lintr); <* fisier header stli%)h *<
]ntoarce o structur[ de tip ldi"_t care con\ine c0tul =i restul ]mp[r\irii ]ntre num[r[tor =i numitor ]n membrii >uot =i rem de tip long ai acestei structuri.
int remo"e(const char *numefis); <* fisier header stdio)h *<
=terge fi=ierul cu nume numefis. ntoarce 0 ]n caz de succes =i o valoare diferit[ de 0 ]n caz de eroare.
int rename(const char *nume_nou, const char *nume_"echi); <* fisier header stdio)h *<
264
sorteaz[ ]n ordine cresc[toare tabloul %ufD0H,%ufD!H, I,%ufDnr !H folosind metoda Juick1ort. /arametrul lung reprezint[ m[rimea ]n octe\i a fiec[rui element. *unc\ia de comparare este *cmp =i trebuie s[ ]ntoarc[ o "aloare60 dac[ arg!6arg5 o "aloare70 dac[ arg!7arg5 o "aloare80 dac[ arg!8arg5
"oid %search(const "oid *cheie, const "oid *%uf, size_t nr, size_t lung, int(*cmp)(const "oid *arg!, const "oid *arg5)); <* fisier header stdli%)h *<
caut[ ]n tabloul ordonat %ufD0H,%ufD!H,I,%ufDnr !H ] ntorc0nd un pointer c[tre primul membru care corespunde c$eii indicat[ de c$eie, ]n caz de succes, sau -.++ ]n caz contrar. !emnifica\ia parametrilor este cea descris[ la func\ia >sort().