strcpy()

Funcția strcpy() copiază un șir de caractere (sursa) într-un alt șir (destinația).

Utilizarea funcției implică includerea bibliotecii <cstring> în program.

Sintaxa
char* strcpy(char* destinatie, const char* sursa);
Parametri
  • destinatie: șirul de caractere în care vrem să copiem;
  • sursa: șirul al cărui conținut îl copiem în șirul destinație.
Returnare
Funcția returnează un pointer spre șirul destinație. Indiferent dacă ne folosim sau nu de această referință, copierea se realizează oricum în șirul destinatie, valoarea returnată nu este un șir nou.

Exemplu de utilizare

#include <cstring>
// ...
char sursa[] = "Copiaza-ma!";
char destinatie[20];

strcpy(destinatie, sursa);

cout << destinatie;
Copiaza-ma!

După inițializarea șirului sursă printr-o declarare cu valoare implicită, am apelat funcția strcpy(), obținând astfel o copie în șirul destinație.

Funcția strcpy pune automat marca de sfârșit de șir ('\0') în șirul destinație.


Ștergerea caracterelor din șirul de caractere

Funcția strcpy poate fi folosită nu doar pentru copierea șirurilor, ci și ca unealtă pentru eliminarea unor caractere din interiorul unui șir de caractere. Ideea este simplă: suprascriem caracterele nedorite cu cele care urmează în șir.

Pentru a șterge k caractere începând de la poziția poz dintr-un șir s, putem folosi următoarea combinație de instrucțiuni:

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

Unde:

  • s este șirul în care vrem să ștergem caractere;
  • aux este un șir auxiliar (buffer temporar);
  • poz este poziția de la care începem ștergerea (începând de la 0);
  • k este numărul de caractere de șters.

Exemple de ștergere a caracterelor

Ștergerea primului caracter:

strcpy(aux, s + 1);
strcpy(s, aux);

Ștergerea caracterului al 3-lea (index 2):

strcpy(aux, s + 3);     // poz = 2, k = 1
strcpy(s + 2, aux);

Ștergerea primelor 5 caractere:

strcpy(aux, s + 5);
strcpy(s, aux);

Ștergerea a 3 caractere începând cu poziția 6:

strcpy(aux, s + 9);     // poz = 6, k = 3
strcpy(s + 6, aux);

Alternativă pentru trunchiere

Pentru a trunchia un șir de caractere (să eliminăm caractere de la finalul acestuia), nu avem nevoie de strcpy. Este suficient să punem marca de sfârșit '\0' pe poziția dorită.

Păstrarea primelor 3 caractere:

s[3] = '\0';

Ștergerea ultimelor 3 caractere, fără a ști lungimea (se folosește funcția strlen):

s[strlen(s) - 3] = '\0';

Ștergere fără șir auxiliar

Există o variantă rapidă de ștergere, fără utilizarea unui șir de caractere auxiliar.

strcpy(s + poz, s + poz + k);

Această versiune scrie direct peste șirul inițial, fără să folosească un buffer intermediar. Poate funcționa bine, dar nu este recomandată în situații unde memoria se suprapune sau când nu suntem siguri de conținutul exact al șirului.


strncpy()

Funcția strncpy() copiază un număr fix de caractere din șirul sursă în șirul destinație.

Utilizarea funcției implică includerea bibliotecii <cstring> în program.

Sintaxa
char* strncpy(char* destinatie, const char* sursa, size_t n);
Parametri
  • destinatie: șirul de caractere în care se realizează copierea;
  • sursa: șirul din care copiem caractere;
  • n: un număr (întreg) de caractere ce vor fi copiate.
Returnare
Funcția returnează din nou un pointer spre șirul destinație, cu un comportament asemănător subprogramului de bază.

Particularitate la utilizare

Există un lucru important de reținut despre utilizarea strncpy():

  • copiază cel mult n caractere în destinatie;
  • dacă sursa are mai puțin de n caractere, restul va fi completat cu caractere '\0';
  • invers, dacă sursa are mai mult de n caractere, șirul rezultat nu este terminat automat cu '\0'! Trebuie adăugată marca de sfârșit manual.

Exemplu cu inserarea caracterului nul

#include <iostream>
#include <cstring>
using namespace std;

int main() {
    char sursa[] = "Salutare!";
    char destinatie[10];

    strncpy(destinatie, sursa, 5);
    destinatie[5] = '\0'; // marca inserata manual

    cout << "Destinatie: " << destinatie << endl;
    return 0;
}
Destinatie: Salut

Exemplu de copiere în interiorul șirului

Următorul exemplu ilustrează cum putem folosi subprogramul strncpy() pentru a copia caractere în mijlocul șirului destinație:

#include <iostream>
#include <cstring>
using namespace std;

int main() {
    char s1[] = "bomboane123.456";
    char s2[] = "Mi-am cumparat dulciuri de la magazin.";

    // copiem in s2 incepand cu poz 15 primele 8 caractere din s1
    strncpy(s2 + 15, s1, 8);

    cout << s2 << endl;
    return 0;
}
Mi-am cumparat bomboane de la magazin.

Ce observăm în codul anterior?

  • din șirul s1 ne interesează doar primele 8 caractere;
  • s2 + 15 este poziția de unde începe cuvântul pe care îl înlocuim;
  • prin apelul strncpy() înlocuim cuvântul „dulciuri” cu „bomboane”;
  • nu este nevoie de marca de sfârșit de șir, deoarece vrem ca restul șirului s2 să rămână intact până la finalul propoziției.