8.6.2. Copierea unui sir de caractere

2019/03/13 in Programare in C

Adesea este nevoie sa se copieze un sir de caractere din zona de memorie in care se afla, intr-o alta zona.

In acest scop se poate folosi functia de prototip:

char *strcpy(char *dest, const char *sursa);

Functia copiaza sirul de caractere spre care pointeaza sursa in zona de memorie a carei adresa de inceput este valoarea lui dest.

Functia copiaza atat caracterele proprii sirului, cat si caracterul NUL de la sfarsitul sirului respectiv.

Se presupune ca zona de memorie in acare se face copierea este destul de mare pentru a putea pastra caracterele copiate. In caz contrar se altereaza datele pastrate imediat dupa zona rezervata la adresa definita de parametrul dest.

La revenire, functia returneaza adresa de inceput a zonei in care s-a transferat sirul, adica chiar valoarea lui dest. Aceasta valoare este pointer spre caractere, deci tipul returnat de functie este char *.

De aceea, prototipul functiei strcpy incepe prin constructia char * (tipul valorii returnate de functie este pointer spre char).

Se observa ca parametrul sursa, care defineste zona in care se afla sirul ce se copiaza, este declarat prin modificatorul const. Aceasta deoarece functia strcpy nu are voie sa modifice sirul care se copiaza. In schimb, parametrul dest nu este declarat cu modificatorul const deoarece functia strcpy modifica zona spre care pointeaza dest (in ea se copiaza caracterele sirului).

Exemple:

  1. char tab[] = "Acest sir se copiaza";
    char t[sizeof tab];
    /* are acelasi numar de elemente ca si tab */
    ...
    strcpy(t, tab);
    /* sirul pastrat in tab se copiaza in zona alocata lui t */
  2. char t[100];
    strcpy(t, "Acest sir se copiaza");
  3. char *p = "Acest sir se copiaza";
    char t[100];
    char *q;
    q = strcpy(t, p);

    Sirul pastrat in zona spre care pointeaza p se transfera in zona spre care pointeaza t. Valoarea lui t se atribuie lui q.

Pentru a copia cel mult n caractere ale unui sir dintr-o zona de memorie in alta, se va folosi functia de prototip:

char *strncpy(char *dest, const char *sursa, unsigned n);

Daca n > lungimea sirului spre care pointeaza sursa, atunci toate caracterele sirului respectiv se transfera in zona spre care pointeaza dest. Altfel, se copiaza numai primele n caractere ale sirului. In rest, functia strncpy are acelasi efect ca si strcpy.

Exemplu:

char *p = "Acest sir se copiaza trunchiat";
char t[10];
strncpy(t, p, sizeof t);

8.6.3. Concatenarea sirurilor de caractere