Sunteți pe pagina 1din 19

Capitolul l0.

Functii din biblioteca standard


2l5
10

Func(ii din biblioteca standard


Limbajul C dispune de set Ioarte bogat de Iunctii predeIinite, usor de
manevrat, cea ce conIer limbajului o mare Ilexibilitate. Aceste Iunctii sunt grupate
in Iunctie de scopul lor in mai multe categorii. Pentru a utiliza aceste Iunctii ele
trebuie declarate in programul care le apeleaz.
Pentru a degreva munca utilizatorului de astIel de declaratii aceste Iunctii
au Iost introduse in Iisiere speciale care se vor include la nceputul programului.
Aceste Iisiere poarta denumirea de Iisiere header si au extensia .h(de exemplu
stdio.h). In aceste Iisiere header se aIl:
- prototipurile Iunctiilor;
- deIinitii de constante necesare acestor Iunctii;
- structuri utilizate de copiator;
- alte inIormatii Iolositoare.

Functiile din biblioteca C pot Ii grupate in urmtoarele categorii:
- Iunctii pentru siruri si caractere aIlate in string.h~, ctype.h~
- Iunctii de intrare/iesire aIlate in stdio.h~
- Iunctii matematice aIlate in math.h~
- Iunctii de timp si data aIlate in time.h~
- Iunctii pentru alocarea dinamica aIlate in stdlib.h~
- Iunctii diverse aIlate in stdlib.h~
- Iunctii video pentru modul text aIlate in conio.h~
- Iunctii video pentru modul graIic aIlate in graphics.h~


10. 1. Func(ii pentru prelucrat caractere

Pentru utilizarea acestor Iunctii trebuie inclus in program Iisierul header
ctype.h. Exista doua tipuri de Iunctii:
- Iunctii de genul is...
- Iunctii de conversie a literelor




Capitolul l0. Functii din biblioteca standard
2l6

10.1.1. Func(ii de genul is...

Dintre Iunctiile cel mai des Iolosite amintim:

a) #include <ctype.h>
int isalnum(int ch); //prototipul Iunctiei

- returneaz o valoare diIerita de zero daca argumentul sau ch este o litera sau o
ciIra, in caz contrar returneaz zero.

b) #include <ctype.h>
int isalpha(int ch);

- returneaz o valoare diIerita de zero daca ch este o litera din alIabet si 0 in caz
contrar.

c) #include <ctype.h>
int sccntr(int ch);

- returneaz o valoare diIerita de zero daca ch este un ctrl, adic ch este intre 0h si
0x1Fh sau este egal cu 0x7Fh (DEL) si zero in celelalte cazuri.

d) #include <ctype.h>
int isdigit(int ch);

-returneaza o valoare diIerita de zero daca ch este o ciIra (0 la 9) si zero in celelalte
cazuri.

e) #include <ctype.h>
int isgraph(int ch);

-returneaza o valoare diIerita de zero daca ch este orice caracter tipribil,
diIerit de spatii si zero in celelalte cazuri. Caracterele tipribile se aIl in domeniul
0x21 si 0x7Eh.

I) #include <ctype.h>
int islower(int ch);

- returneaz o valoare diIerit de zero dac ch este o liter mic si zero in
celelalte cazuri.


Capitolul l0. Functii din biblioteca standard
2l7

g) #include <ctype.h>
int isprint(int ch);

- returneaz o valoare diIerit de zero dac ch este un caracter tipribil
incluznd si spatiul si zero n celelalte cazuri. Caracterele tipribile si spatiul liber
sunt in domeniul 0x20 si 0x7E.

h) #include <ctype.h>
int ispunct(int ch);

- returneaz o valoare diIerit de zero dac ch este un caracter de
punctuatie, excluznd si spatiul si 0 n celelalte cazuri. Termenul "punctuatie"
deIinit de aceast Iunctie include toate caracterele tipribile care nu sunt nici
alIanumerice si nici spatii.

i) #include <ctype.h>
int isspace(int ch);

- returneaz o valoare diIerit de zero dac ch este un spatiu, TAB, TAB
VERTICAL, FORM FEED, CARRIAGE RETURN, NEW LINE si zero n caz
contrar.

j) #include <ctype.h>
int isupper(int ch);

- returneaz o valoare diIerit de zero dac ch este liter mare (A-Z) si
zero n caz contrar.

k) #include <ctype.h>
int isxdigit(int ch);

- returneaz o valoare diIerit de zero dac ch este o ciIr hexazecimal si
zero n caz contrar.

10.1.2. Func(ii de conversie

a) #include<ctype.h>
int tolower(int ch);


Capitolul l0. Functii din biblioteca standard
2l8
Functia returneaz litera mic echivalent a lui ch dac ch este liter, iar
in caz contrar returneaz ch

b) #include <ctype.h>
int toupper(int ch);

Functia returneaz litera mare echivalent a lui ch daca ch este o liter mic, n
caz contrar returneaz chiar ch.

c) int _tolower(int ch);

Are eIect la Iel ca tolower(), dar rezultatul este imprevizibil dac ch nu este
liter mare.

d) int _toupper(int ch);

Are eIect la Iel ca toupper(), dar rezultatul este imprevizibil daca ch nu
este liter mic.


10. 2. Func(ii pentru prelucrarea yirurilor
de caractere

Aceste Iunctii opereaz asupra sirurilor. De retinut c un sir in limbajul C
se termin cu caracterul terminator '\0'. Operatiile pe aceste siruri se Iac pn la
ntlnirea caracterului '\0' sau pe o lungime speciIicat (pe un anumit numr de
octeti). Dac lungimea speciIicat este mai mare dect lungimea sirului operatiile
se Iac numai pe lungimea sirului.
Se utilizeaz Iisierul header string.h~ pentru manipularea sirurilor de
caractere. Exist urmtoarele Iunctii:

strcat(); concateneaz sir
strncat(); concateneaz n caractere la un sir
strcpy(); copiaz un sir
strncpy(); copiaz n caractere dintr-un sir
strdup(); duplica un sir
strchr(); caut un caracter intr-un sir
strrchr(); caut ultima aparitie a unui caracter intr-un sir
strstr(); caut subsir
strcmp(); compara doua siruri


Capitolul l0. Functii din biblioteca standard
2l9
stricmp(); compara doua siruri Ir sa deosebeasc literele mari de
literele mici
strncmp(); compara n caractere din doua siruri
strnicmp(); compara n caractere din doua siruri Ir sa deosebeasc
literele mari de cele mici
strlwr(); converteste sir la litere mici
strupr(); converteste sir la litere mari
strset(); initializeaz caracterele unui sir cu o valoare
strnset(); initializeaz n caractere din sir cu o valoare
strrev(); inverseaz caracterele unui sir
strlen(); returneaz lungimea unui sir


1. strcat(), strncat ()
Sintaxa:
char*strcat(char*dest,const char*sursa);
char*strncat(char*dest,const char*sursa,size_t n);
Scop: concateneaz doua siruri;
Strcat() adaug sirul indicat de sursa la sirul indicat de dest si adaug apoi
caracterul terminator null('\0'); returneaz un pointer la sirul rezultat (dest);
strncat() adaug primele n caractere de la sirul indicat de sursa la sirul indicat de
dest; daca n este mai mare dect lungimea sirului atunci se concateneaz numai
sirul sursa (deci se concateneaz caractere din sirul surs la sirul destinatie pn se
concateneaz n caractere sau pn se ajunge la sIrsitul sirului destinatie);
returneaz un pointer la sirul rezultat (dest).

2. strcpy(), strncpy()
Sintaxa:
char*strcpy (char*s1, const char*s2);
char*strncpy (char*s1, const char*s2, size_t n);
Scop: strcpy copiaz sirul indicat de s2, inclusiv caracterul terminatorul de sir '\0',
la adresa indicat de s1 si returneaz s1; strncpy copiaz n octeti din sirul indicat
de s2 la adresa indicat de s1 si returneaz s1; dac n este mai mic dect lungimea
sirului s2, caracterul null ('\0') nu se adaug automat la sirul copiat; dac este mai
mare dect lungimea sirului s2, atunci se adaug caracterul null pn la
completarea lungimii n; rezultatul este nedeIinit dac zona de memorie pentru sirul
s1 se suprapune peste cea a sirului s2.

3. strdup()
Sintaxa:
char *strdup(char *s);

Capitolul l0. Functii din biblioteca standard
220
Scop: Iace o copie a unui sir; aloca spatiu de memorare pentru a copia sirul indicat
de s si returneaz un pointer la adresa care contine copia sirului s; returneaz
pointerul NULL dac nu poate aloca spatiu de memorare.

4. strchr(), strrchr(), strstr();
Sintaxa:
char *strchr (const char *s, int c);
char *strrchr(const char *s, int c);
char *strstr (const char *s1, const char *s2);
Scop: strchr returneaz un pointer la prima aparitie a caracterului c in sirul
indicat de s (la primul octet din sirul indicat de s care este egal cu c); caracterul
terminator '\0' este inclus n cutare; dac caracterul c nu este gsit se returneaz
pointerul NULL;
strrchr returneaz un pointer la ultima aparitie a caracterului c in sirul
indicat de s; se returneaz pointerul NULL dac caracterul c nu este gsit;
strstr returneaz un pointer la prima aparitie a sirului indicat de s2 n sirul
indicat de s1; returneaz pointerul NULL dac sirul indicat de s2 nu este gsit in
sirul indicat de s1;

5. strcmp(), stricmp(), strncmp(), strnicmp();
Sintaxa:
int strcmp (const char *s1, const char *s2);
int stricmp (const char *s1, const char *s2);
int strncmp (const char *s1, const char *s2, size_t n);
int strnicmp(const char *s1, const char *s2, size_t n);
Scop: strcmp compar sirul indicat de s1 cu sirul indicat de s2 si returneaz o
valoare care indic relatiile dintre ele:
valoare semniIicatie
0 s1 s2
0 s1 identic cu s2
~ 0 s1 ~ s2
strncmp compar, cel mult, primele n caractere din sirul indicat de s1 si
sirul indicat de s2 si returneaz valoarea care indic relatiile dintre ele;
stricmp si strnicmp compar cele doua siruri la Iel ca strcmp si strncmp
dar nu Iac distinctia intre literele mici si literele mari;

6. strlwr, strupr ( conversi.c );
Sintaxa:
char *strlwr(char *s);
char *strupr(char *s);
Scop: strlwr converteste literele mari din sirul indicat de s in litere mici; celelalte
caractere rmn neaIectate;


Capitolul l0. Functii din biblioteca standard
22l
strupr converteste literele mici din sirul indicat de s in litere mari; celelalte
caractere rmn neaIectate;
Valoare returnat: returneaz un pointer la sirul convertit.

7. strset(), strnset();
Sintaxa:
char *strset (char *s, int c);
char *strnset(char *s, int c, size_t n);
Scop: strset initializeaz toate caracterele din sirul indicat de s cu caracterul c
Ir a modiIica caracterul terminator de sir;
strnset initializeaz cel mult n caractere din sirul indicat de s cu caracterul
c; daca n este mai mare dect lungimea sirului atunci se utilizeaz lungimea
sirului in loc de n;
Valoare returnat: returneaz un pointer la sirul initializat.

8. strrev ();
Sintaxa:
char strrev(char *s);
Scop: inverseaz ordinea caracterelor in sirul indicat de s; caracterul terminator '\0'
rmne pe loc;
Valoare returnat: returneaz un pointer la sirul inversat.

9. strlen();
Sintaxa:
sizeoI strlen(const char *s);
Scop: returneaz lungimea in octeti a sirului indicat de s; nu se include in lungime
si caracterul terminator '\0'.


Exemple:
a) #inlude<stdio.h>
#include<string.h>
void main(void) {
char sir1[80],sir2[80];
printf("Introduceti primul sir");
gets(sir1);
printf("Introduceti al doilea sir");
gets(sir2);
strcat(sir1,sir2);
printf("Sirul rezultat este=%s",sir1);
}


Capitolul l0. Functii din biblioteca standard
222
b) #include<stdio.h>
#include<string.h>
void main(void) {
char *px;
p=strchr("Acesta este un text. ", (int) 'a');
printf(p);
}

c) Testarea parolei introduse

#include<stdio.h>
#include<string.h>
int password(void){
char parola[20];
printf("Introduceti parola");
gets(parola);
if(strcomp(parola, "sesam"){
printf("Incorecta\n");
return 0;
}
else return 1;
}
10.3. Func(ii matematice

Categoriile de Iunctii matematice care au argumente de tip double si
returneaz valori double, deIinite de ANSI C sunt:
- Iunctii trigonometrice
- Iunctii hiperbolice
- Iunctii exponentiale si logaritmice
- Iunctii diverse
Toate aceste Iunctii cer Iisierul header math.h~

#include<math.h>

a) double acos(double arg);
- retruneaz arccosinusul argumentului arg. Aceasta trebuie sa Iie in
domeniul |-1,1|, in caz contrar apare o eroare.

b) double asin(double arg);
- returneaz arcsinusul argumentului arg, argument care trebuie sa Iie in
domeniul |-1,1|. Daca arg nu apartine acestui domeniu apare eroare de domeniu.




Capitolul l0. Functii din biblioteca standard
223
c) double atan(double arg);
- returneaz arctangenta argumentului arg.

d) double atan2(double y, double x);
- returneaz arctangenta Iunctiei y/x. Functia Ioloseste semnele
argumentelor pentru a determina cadranul n care se aIla valoarea de retur.

e) double ceil(double num);
- returneaz cel mai mic ntreg reprezentat ca double care este mai mare
dect num. De exemplu ceil(1.02) va da 2.0, ceil(-1.32) va returna -1.0.

I) double cos(double arg);
- returneaz cosinusul argumentului arg. Argumentul trebuie dat in
radiani.

Exemplu. AIisarea lui x si a lui cos(x) pentru 0x45 cu pasul de 5 grade

. . . . . .
int x=0;
do {
printf("x%d cos(%d)=%f\n",x,x, cos (double)(x*3.1419/180))
x+=5;
} while (x<=45);
. . . . . .

g) double cosh (double arg);
- returneaz cosinusul hiperbolic al argumentului. Valoarea argumentului
trebuie sa Iie exprimata in radiani

Exemplu. AIiseaz x si cosh de x pentru 0x45 cu pasul de 5 grade

. . . . . .
int x=0;
do {
printf("cosh(%d)=%f\n",x,cosh((double)(x*3.14/180));
x+=5;
}while(x<=45);
. . . . . . .

h) double exp(double arg);
- returneaz e la puterea arg, unde e2.71181282


Capitolul l0. Functii din biblioteca standard
224
i) double fabs(double num);
- returneaz valoarea absoluta a argumentului nume

j) double floor(double num);
- returneaz cel mai mare ntreg, reprezentat ca double, mai mic dect
num. De exemplu . pentru 1.12 Iunctia va returna 1.0, iar pentru -1.31 va returna -
2.0.

k) double log(double num);
- returneaz logaritmul natural al argumentului num. Daca num este
negativ apare eroare de domeniu, iar daca este 0 apare eroare de reprezentare.

l) double log10(double num);
- returneaz logaritmul in baza 10 al argumentului num. Daca num 0
eroare de domeniu, iar daca num0 atunci eroare de reprezentare.

m) double pow(double baza,double exp);
- returneaz baza la puterea exponent. Daca baza este 0 si exponent0,
apare eroare de domeniu. Acelasi lucru se ntmpla si cnd baza0 si exp nu este
un ntreg. O depsire va produce eroare de reprezentare.

n) double sin(double arg);
- returneaz sinusul argumentului arg. Argumentul trebuie sa Iie exprimat
in radiani.

o) double sinh(double arg);
- retruneaz sinusul hiperbolic al argumentului arg. Argumentul trebuie
dat in radiani.

p) double sqrt(double num);
- returneaz rdcina ptrata a argumentului num. Daca argumentul este
negativ apare eroare de domeniu.

r) double tan(double arg);
- returneaz tangenta argumentului arg, exprimat in radiani

s) double tanh(double arg);
- returneaz tangenta hiperbolica a argumentului arg, exprimat in radiani.




Capitolul l0. Functii din biblioteca standard
225
10.4. Func(ii de conversie date

Trebuie incluse n program Iisierele header math.h .si stdlib.h~.

10.4.1. Func(ii ce returneaz valoarea absoluta

a) int abs(int n);
- returneaz valoarea absoluta a ntregului num.

Exemplu
#include<stdlib.h>
#include<stdio.h>
int get_abs(void){
char num[40];
gets(num);
return abs(atoi(num));
}

b) double fabs(double x);
- argument real dubl precizie

c) long labs(long n);
- returneaz valoarea absoluta a unui long int.

Exemplu
. . . . .
long int det_labs(void)
{
char num[60];
gets(num);
return labs(atoll(num));
}

d) long double fabs(long double x);
- argument Ilotant lung
Functiile returneaz valoarea absoluta a argumentului.

Capitolul l0. Functii din biblioteca standard
226

10.4.2. Func(ii ce convertesc un yir ASCII intr-un numr

a) int atoi(char *sir);
- converteste un sir ASCII intr-un numr ntreg
TransIorm sirul de caractere punctat de str intr-o valoare ntreag. Sirul
trebuie sa contin un numr ntreg corect. Daca acest lucru nu se ntmpla, Iunctia
returneaz 0. Numrul ntreg in str poate Ii terminat prin orice caracter care nu
poate Iace parte dintr-un numr ntreg , cum ar Ii spatiul liber, caractere de
punctuatie, alte caractere. De exemplu daca Iunctia atoi() este apelata cu "213.67
STOP" va Ii returnat valoarea 213 iar 0.67 v-a Ii ignorata .

Exemplu. Program ce citeste doua numere ntregi , le aduna , le scade si le
aIiseaz.

#include <stdio.h>
# include <stdlib.h>
void main(void)
{
char num1[40],num2[40];
printf("introduceti primul numar:");
gets(num1);
printf("introduceti al doilea numar:");
gets(num2);
printf("suma=%d, diferenta=%d\n",atoi(num1)+atoi(num2),
atoi(num1)-atoi(num2));
}

b) double atof(char *sir);
- converteste un sir ASCII intr-un numr real
TransIorma sirul de caractere punctat de str intr-o valoare double. Sirul
trebuie sa contin un numr Iloat valid. Daca acest lucru nu se ntmpla, Iunctia
returneaz 0. Numrul poate Ii terminat prin orice caracter care nu poate Iace parte
dintr-un numr Iloat, cum ar Ii spatiul de caractere de punctuatie (exceptnd
punctul zecimal), alte caractere dect 'E' si 'e'. De exemplu daca atoI() este apelata
cu "213.67 STOP" va Ii returnat valoarea 213.67.

Exemplu. Program ce citeste doua numere Iloat, le aduna, le scade si le aIiseaz.

#include <stdio.h>
# include <stdlib.h>
void main(void){
char num1[40],num2[40];


Capitolul l0. Functii din biblioteca standard
227
printf("introduceti primul numar:");
gets(num1);
printf("introduceti al doilea numar:");
gets(num2);
printf("suma=%f, diferenta=%f\n",atof(num1)+atof(num2),
atof(num1)-atof(num2));
}

c) long atol(char *sir);
- converteste un sir ASCII intr-un numr ntreg lung
TransIorm sirul de caractere punctat de str intr-o valoare long int. Sirul
trebuie sa contin un numr long int corect. Daca acest lucru nu se ntmpla,
Iunctia returneaz 0. Numrul long int in str poate Ii terminat prin orice caracter
care nu poate Iace parte dintr-un numr ntreg , cum ar Ii spatiul liber, caractere de
punctuatie, alte caractere. De exemplu daca Iunctia atol() este apelata cu "213.67
STOP" va Ii returnat valoarea 213 iar 0.67 v-a Ii ignorata .

Exemplu. Program ce citeste doua numere long int , le aduna , le scade si le
aIiseaz.

#include <stdio.h>
# include <stdlib.h>
void main(void){
char num1[40],num2[40];
printf("introduceti primul numar:");
gets(num1);
printf("introduceti al doilea numar:");
gets(num2);
printf("suma=%ld,diferenta=%ld\n",atol(num1)+atol(num2),
atol(num1)-atol(num2));
}


d) long double atold(char *sir);
- converteste un sir ASCII intr-un numr Ilotant lung

Functiile convertesc sirul de caractere numerice indicat de sir intr-un
numr. Functiile citesc din sirul de intrare pn la primul caracter care nu e ciIra
sau pn se ntlneste caracterul terminator de sir'\0'; spatiile si tab-urile sunt
ignorate.
Daca sirul nu poate Ii convertit se returneaz valoarea 0.


Capitolul l0. Functii din biblioteca standard
228
10.4.3. Func(ii ce convertesc un ntreg intr-un yir ASCII

a)
char *itoa (int valoare, char *sir, int radix);

b)
char *ltoa (long valoare, char *sir, int radix);
char *ultoa(unsigned long valoare, char *sir, int radix);
Functiile convertesc numrul valoare la un sir de caractere care se termina
cu caracterul '\0' si l depune la adresa indicata de sir. Argumentul radix speciIic
baza de numeratie a valorii. Daca radix este 10 si valoare este un numr negativ,
primul caracter de la sirul convertit este semnul minus ("-"). Aceste Iunctii
returneaz un pointer la sir.

10.4.4. Func(ii ce convertesc un numr flotant
la un yir de caractere

char *gcvt(double valoare, int cifre, char *sir);

Argumentul valoare este numrul ce va Ii convertit la un sir de caractere si
va Ii depus la adresa indicat de sir adugind si caracterul terminator de sir '\0'; se
vor obtine attea ciIre semniIicative cte s-au dat prin argumentul ciIre.

10.5. Func(ii ce genereaz numere aleatoare

int rand(void);
void srand(unsigned init);
Functia srand initializeaz generatorul de numere aleatoare - pozitioneaz
punctul de start pentru generarea unei serii de numere pseudoaleatoare;
reinitializarea la valoarea implicita se Iace cu init egal cu 1; orice alta valoare
pentru init initializeaz generatorul la un punct de start aleator.
Functia rand returneaz un numr ntreg pseudoaleator in domeniul 0 -
RANDMAX.

10.6. Func(ii pentru alocarea dinamic

Programele scrise in C pot stoca (memora) inIormatii in memoria
operativa a calculatorului. Exist doua posibilitti:
- utiliznd variabilele globale si locale, incluznd tablourile si structurile.
In cazul variabilelor globale si al variabilelor locale statice, memoria este Iixat n


Capitolul l0. Functii din biblioteca standard
229
timpul compilrii. Pentru variabilele locale, memoria este alocat din spatiul
rezervat stivei. Desi aceste variabile sunt eIicient implementate in C, ele reclam ca
utilizatorul s cunoasc n avans cantitatea de memorie necesar pentru Iiecare
situatie.
- prin alocare dinamic. n acest caz, memoria este alocat prin aria de
memorie liber, n Iunctie de necesitatile programului.

a)
#include <stdio.h>
void *calloc(size_t num, size_t size);

- returneaz un pointer ctre primul byte al memoriei alocate. Cantitatea
de memorie alocat este egal cu num*size. Acest lucru Iace ca Iunctia calloc() s
aloce suIicient memorie pentru un tablou ce contine num obiecte, Iiecare element
avnd dimensiunea size.
Dac nu exist memorie suIicient pentru a satisIace cererea de alocare, este
returnat un pointer null. Este important a se veriIica valoarea de retur a Iunctiei
nainte de a ncerca s Iolosim aceast cantitate de memorie.

Exemplu : Functie care returneaz un pointer ctre un tablou de 50 de elemente de
tip Iloat, alocat dinamic:

#include<stdio.h>
#include<stdlib.h>
float *get_num(void){
float *p;
p=(float*)calloc(50,sizeof(float));
if(!p){
printf("a esuat alocarea");
exit(1);
}
return p;
}

b)
#include<stdlib.h>
#include<free*ptr>;

- elibereaz memoria punctat de ptr. E necesar ca Iunctia Iree() s Iie
apelat cu un pointer care a Iost obtinut anterior prin utilizarea uneia din cele doua
Iunctii de alocare: malloc() sau calloc().


Capitolul l0. Functii din biblioteca standard
230
Exemplu. Program care aloc spatiu pentru un sir introdus de utilizator si apoi
elibereaza spatiul:
#include<stdio.h>
#include<stdlib.h>
void main(void){
char *sir[50];
int i;
for(i=0;i<50;i++){
if sir[i]=(char*)malloc(128))==null){
printf("Eroare de alocare");
exit(0);
}
gets(sir[i]);
/*elibereaza memoria*/
for(i=0;i<=100;i++) free(sir[i]);
}

c)
#include<stdlib.h>
void *malloc(size_t size);

- returneaz un pointer ctre primul byte al zonei de memorie de
dimensiune size care a Iost alocat de heap. Dac nu exist suIicient memorie n
heap pentru a satisIace cererea, Iunctia malloc() returneaz un pointer null. Este
indicat a se veriIica valoarea de retur a Iunctiei nainte de a ncerca sa se utilizeze
memoria alocat.
Exemplu. Functie pentru a aloca memorie suIicient pentru structuri de tip addr:

#include <stdlib.h>
#include <stdio.h>
struct addr{
char nume[20];
char street[40];
int numar;
char city[15];
char country[20];
};
struct addr *get_struct(void){
struct addr *p;
if((p=(struct addr*)malloc(sizeof(struct addr)))==null){
printf("Eroare de alocare");
exit(0);
}
return p;
}


Capitolul l0. Functii din biblioteca standard
23l

d)
#include <stdlib.h>
void *realloc(void*ptr,size_t size);

- modiIic dimensiunea unei zone de memorie alocat, punctat de ptr, la
dimensiunea deIinit de size. Valoarea lui size poate Ii mai mare sau mai mica
dect dimensiunea original.
Functia realloc() returneaz un pointer ctre blocul de memorie alocat, deoarece
poate Ii necesar mutarea blocului pentru a mri dimensiunea. Dac se produce
mutarea blocului, continutul blocului este copiat n noul bloc Ir sa aib loc
pierderi de inIormatii. Dac in heap nu exista suIicienta memorie liber pentru a
aloca size bytes, Iunctia returneaz un pointer null si blocul original este eliberat
(pierdut). Deci este necesar s se veriIice dac apelarea Iunctiei realloc() a Iost
eIectuat cu succes.

Exemplu. Program care aloc memorie pentru 31 caractere, copiaz in spatiul
alocat sirului "Memoria alocat are 31 caractere" si apoi Iolosind realloc() mreste
dimensiunea zonei la 33 de caractere, pentru a adauga doua puncte(..) la sIrsit:

#include<stdlib>
#include<string.h>
#include<stdio.h>
void main(void){
char *p;
p=(char*)malloc[32];
if (!p){
printf("Eroare de alocare");
exit(1);
}
strcpy(p, "Memoria alocata are 31 caractere");
p=realloc(p,33);
if(!p){
printf("Eroare de realocare");
exit(1);
}
strcat(p,"..");
printf(p);
free(p);
}



Capitolul l0. Functii din biblioteca standard
232
10.7. Func(ii diverse

a)
#include <stdlib.h>
void abort(void);

- are ca eIect terminarea imediat a programului, dar nu nchide Iisierele
deschise.
Exemplu:
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
void main(void){
for( ; ; )
if(getche()=='A')abort();
}

b)
#include<stdlib.h>
void exit( int status);

- are ca eIect terminarea imediat a programului. Valoarea status este
transIerat procedurii apelante, deci n mod uzual sistemului de operare. Prin
conventie, dac status este zero, se presupune o terminare normal a programului.
O valoare diIerit de zero poate Ii utilizat ca un indicator de eroare.

Exemplu

# include <stdio.h>
# include<stdlib.h>
char meniu(void){
char ch;
do {
printf("Enter (E)\n");
printf("Delete (D)\n");
printf("Print (P)\n");
printf("Quit (Q)\n");
} while (!strch("EDPQ", toupper(ch));
if(ch=='Q' ) exit(0);
return ch;
}

c)
#include <stdlib.h>


Capitolul l0. Functii din biblioteca standard
233
int rand(void);

- genereaz o secvent de numere aleatoare. De Iiecare dat cnd este
apelat se genereaz un ntreg ntre 0 si RANDMAX.. ConIorm ANSI C
RANDMAX este 32767.

Exemplu

int i;
for (i=0; i<10; i++}
printf("%d",rand());

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