Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
char * file; // pointer neinitializat, nu se aloca memorie<br />
O versiune mai sigurã si cu mai putine argumente ar folosi alocarea dinamicã de<br />
memorie pentru noul nume de fisier creat de functie:<br />
char* modext (char* oldfile, char *ext) {<br />
char * p, *newfile;<br />
newfile = (char*) calloc (strlen(oldfile) + strlen(ext)+1,1); // aloca memorie<br />
strcpy(newfile,oldfile); // copiaza vechiul nume<br />
p =strrchr(newfile,'.'); // cauta pozitia ultimului punct din nume<br />
if (p != NULL) // daca exista o extensie<br />
*p=0; // elimina extensia veche din nume<br />
strcat( strcat(newfile,"."),ext); // atunci se adauga extensia "ext"<br />
return newfile; // rezultatul functiei<br />
}<br />
In general nu se scriu functii care sã aloce memorie fãrã sã o elibereze, deoarece<br />
apelarea repetatã a unor astfel de functii poate duce la consum inutil de memorie. Nici<br />
nu este bine ca eliberarea memoriei alocate sã revinã celui care apeleazã functia.<br />
O solutie <strong>în</strong>selãtoare este utilizarea unui vector local cu dimensiune constantã:<br />
char* modext (char* oldfile, char *ext) {<br />
char * p, newfile[80];<br />
strcpy(newfile,oldfile); // copiaza vechiul nume<br />
. . . }<br />
In general nu se recomandã functii care au ca rezultat adresa unei variabile locale,<br />
desi erorile de utilizare a unor astfel de functii apar numai la apeluri succesive (<strong>în</strong><br />
cascadã) de functii cu variabile locale. Exemplu:<br />
// extrage un subsir de lungime n de la adresa s<br />
char * substr (char* s, int n) {<br />
char aux[1000]; // o variabila locala pentru subsirul rezultat<br />
int m;<br />
m=strlen(s); // cate caractere mai sunt la adresa s<br />
if (n>m) n=m;<br />
strncpy(aux,s,n);<br />
aux[n]=0; // terminator de (sub)sir<br />
return aux; // pointer la o variabila locala !<br />
}<br />
// verificare functie<br />
int main () {<br />
puts (substr("abcdef",3)); // corect: abc<br />
puts (substr (substr("abcdef",4),2)); // corect sau nu, functie de<br />
implementare<br />
}