strcpy( )

  Subprogramul strcpy() copiază un șir de caractere în alt șir.

strcpy()

Parametri

  • <destinație> : șirul în care copiem;
  • <sursă> : șirul de unde copiem.

Utilizare

  Atât funcția strcpy(), cât și derivata ei (strncpy()), fac parte din biblioteca <cstring>. Ea trebuie inclusă în directiva de preprocesare.

  Pentru a copia conținutul unui șir în altul, vom folosi funcția strcpy().

#include <cstring>
...
int main(){
  char s1[51], s2[51];
  cin.get(s1,51);
  cin.get();
  cin.get(s2,51);
  strcpy(s2,s1);
  cout<<s2;
  return 0;
}
Am cumparat 1kg de mere.
Imi plac fructele.
Am cumparat 1kg de mere.

  După ce se citesc ambele șiruri, conform apelului strcpy(s2,s1), îl vom copia în șirul s2 pe s1. Subprogramul strcpy() are grijă să își pună singur marcă de sfârșit de șir după copierea tuturor caracterelor din șirul din al doilea parametru (sursa).
  În acest exemplu, șirul „destinație” are mai puține caractere decât cel „sursă”, dar să vedem ce se întâmplă dacă destinația are mai multe caractere:

prune
Fructele sunt sanatoase.
prune

  După cum am mai precizat, funcția strcpy() își va pune singură o marcă de sfârșit de șir după ultimul caracter copiat. La noi, ultima literă din s1 („e”) va fi copiată în s2[4]; astfel, în s2[5] se va afla caracterul NULL. Afișarea cu cout se va termina la întâlnirea primului caracter NULL, iar acest lucru ne dă impresia că s-au șters toate celelalte caractere din s1. Dacă vom afișa caracterul s2[6] vom regăsi caracterul rămas dinainte, adică litera „l”.

Ștergerea caracterelor dintr-un șir

  Cu ajutorul acestui subprogram putem compune metode de a elimina caractere dintr-un șir. Pe același principiu ca la tablourile unidimensionale, ștergerea unuia sau a mai multor caractere se face prin suprapunerea lor cu elementele următoare și scăzând numărul de elemente (aici prin marca de sfârșit).
  Astfel, putem deduce o formă generală pentru ștergerea caracterelor:

strcpy(aux,s+poz+k); strcpy(s+poz,aux); , unde:

  • s este șirul de caractere în care operăm;
  • aux este un șir auxiliar în care stocăm o parte din șir;
  • poz este poziția din care vrem să începem ștergerea;
  • k reprezintă numărul de caractere pe care le vrem șterse.
    Exemple:
  1. ștergerea primului caracter: strcpy(aux,s+1); strcpy(s,aux);
  2. ștergerea caracterului al 3-lea: strcpy(aux,s+4); strcpy(s+3,aux);
  3. ștergerea primelor 5 caractere: strcpy(aux,s+5); strcpy(s,aux);
  4. ștergerea a 3 caractere începând cu poziția 6: strcpy(aux,s+9); strcpy(s+6,aux);

Dacă vrem să eliminăm caractere de la sfârșitul șirului, putem să adăugăm o marcă de sfârșit de șir (NULL) pe prima poziție care trebuie ștearsă.
  De exemplu, dacă vrem să păstrăm doar primele 3 caractere, vom executa: s[3]=NULL;; iar dacă vrem să scoatem ultimele 3 caractere dintr-un șir cu lungime necunoscută, ne putem folosi de funcția strlen: s[strlen(s)-3]=NULL;.

Mai există o modalitate de ștergere, care nu este foarte sigură. Are sintaxa: strcpy(s+poz,s+poz+k);. Recomand utilizarea celei cu șirul auxiliar, este mult mai safe.


strncpy()

strncpy()

  Funcția strncpy aduce un al treilea parametru, care reprezintă numărul maxim de elemente copiate.

  Modul de funcționare putem spune că e deductibil, practic se va copia un număr fix de caractere, în funcție de valoarea din parametrul al treilea.

Funcția strncpy() nu adaugă marcă de sfârșit de șir, astfel că se pune „manual” dacă este nevoie, după caz.

#include <cstring>
...
int main(){
  char s1[]="bomboane123.456",
  s2[]="Mi-am cumparat dulciuri de la magazin.",
  s3[]="Cati ani am? Am 15 ani si 3 luni.";
  strncpy(s2+15,s1,8); 1
  strncpy(s3+16,s1+9,3); 2
  s3[19]=NULL;
  cout<<s2<<'\n'<<s3;
  return 0;
}
Mi-am cumparat bomboane de la magazin.
Cati ani am? Am 23.

  Vom împărți exemplul pe bucăți:

1 Vrem să înlocuim cuvântul „dulciuri” din s2 cu „bomboane” din s1. Destinația (primul parametru) este s2+15, adică prima literă a cuvântului pe care îl înlocuim; sursa va fi șirul s1, în acest caz chiar de la început; vom copia 8 caractere reprezentând numărul de litere ale ambelor cuvinte.
  Nu este nevoie de marcă de sfârșit de șir, deoarece copiem în interior și nu vrem să scurtăm șirul.

2 Aici vrem să înlocuim secvența „15 ani si 3 luni.” cu „23.” . Primul parametru va fi poziția din s3 în care va se va efectua copierea; al doilea parametru este poziția din s1 de unde se vor copia caracterele; al treilea reprezintă cele 3 caractere pe care le vom copia.
  După executarea funcției, în acest caz vrem să scurtăm șirul nostru s3 pentru a nu avea restul caracterelor (este vorba despre secvența „ani si 3 luni”). Vom insera manual caracterul NULL imediat după ultimul caracter, pentru a obține rezultatul dorit la afișare.