17.04.2013 Views

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Functiile de copiere si de concatenare au ca rezultat primul argument (adresa sirului<br />

destinatie) pentru a permite exprimarea mai compactã a unor operatii succesive pe<br />

siruri. Exemplu:<br />

// compune un nume de fisier din nume si extensie<br />

char fnume[20], *nume="test", *ext="cpp";<br />

strcat(strcat(strcpy(fnume,nume),"."),ext);<br />

Utilizarea unor siruri constante <strong>în</strong> operatii de copiere sau de concatenare poate<br />

conduce la erori prin depãsirea memoriei alocate (la compilare) sirului constant.<br />

Exemplu gresit :<br />

strcat (“test”,”.cpp”); // efecte nedorite !<br />

Functiile pentru operatii pe siruri nu pot verifica depãsirea memoriei alocate pentru<br />

siruri, deoarece primesc numai adresele sirurilor; cade <strong>în</strong> sarcina programatorului sã<br />

asigure memoria necesarã rezultatului unor operatii cu siruri. Exemplu corect:<br />

char nume[30]="test";<br />

strcat (nume,”.cpp”);<br />

Definirea de noi functii pe siruri de caractere<br />

Argumentele de functii ce reprezintã siruri se declarã de obicei ca pointeri dar se<br />

pot declara si ca vectori. Ca exemple vom scrie <strong>în</strong> douã moduri o functie de copiere<br />

care functioneazã corect chiar dacã cele douã siruri se suprapun partial (functia<br />

standard “strcpy” nu garanteazã aceastã comportare) :<br />

// cu pointeri<br />

char* scopy ( char * d, char * s) {<br />

char * aux = strdup(s);<br />

strcpy(d,aux);<br />

free (aux);<br />

char * d;<br />

}<br />

// cu vectori<br />

void scopy ( char d[ ], char s[ ]) {<br />

int k,n; char aux[2000]; // o limita ptr sirurile copiate !<br />

n=strlen(s)+1; // nr de caractere copiate (si terminator de sir)<br />

for (k=0; k

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!