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

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Functia “substr” va avea rezultate corecte si la al doilea apel dacã se modificã<br />

declararea variabilei “aux” astfel:<br />

char * aux=strdup(s); // sau: aux= (char*) malloc(strlen(s)+1);<br />

Pentru realizarea unor noi operatii cu siruri se vor folosi pe cât posibil functiile<br />

existente. Exemple:<br />

// sterge n caractere de la adresa “d”<br />

char * strdel ( char *d, int n) {<br />

if ( n < strlen(d))<br />

strcpy(d,d+n);<br />

return d;<br />

}<br />

// insereazã sirul s la adresa d<br />

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

int ls=strlen(s);<br />

scopy (d+ls,d); // deplasare sigura la dreapta sir d<br />

strncpy(d,s,ls); // adauga sirul s la adresa d<br />

}<br />

Precizãri la declararea functiile standard sau nestandard pe siruri :<br />

- Argumentele sau rezultatele ce reprezintã lungimea unui sir sunt de tip size_t<br />

(echivalent de obicei cu unsigned int) si nu int, pentru a permite siruri de lungime mai<br />

mare.<br />

- Argumentele ce reprezintã adrese de siruri care nu sunt modificate de functie se<br />

declarã astfel: const char * str<br />

interpretat ca “pointer la un sir constant (nemodificabil)”. Exemplu:<br />

size_t strlen (const char * s);<br />

Cuvântul cheie const <strong>în</strong> fata unei declaratii de pointer cere compilatorului sã<br />

verifice cã functia care are un astfel de argument nu modificã datele de la acea adresã.<br />

Exemplu de functie care produce un mesaj la compilare:<br />

void trim (const char*s) { // elimina toate spatiile dintr-un sir dat<br />

char *p=s; // avertisment la aceasta linie !<br />

while (*s) {<br />

while (*s==' ') // sau: while (isspace(*s))<br />

++s;<br />

if (s==0) break;<br />

*p++=*s++;<br />

}<br />

*p=0;<br />

}<br />

Cum poate <strong>în</strong>sã compilatorul C sã verifice cã un pointer “const char * ” transmis<br />

unei alte functii nu este folosit <strong>în</strong> acea functie pentru modificarea datelor ?

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

Saved successfully!

Ooh no, something went wrong!