std::strcpy în C++

Copiază (strcpy, strncpy) sau lipește (strcat) șiruri C în tablouri de char.

Sintaxă
#include <cstring>
char* strcpy(char* destinatie, const char* sursa);
char* strncpy(char* destinatie, const char* sursa, std::size_t n);
char* strcat(char* destinatie, const char* sursa);

Ce face std::strcpy

strcpy(dest, sursa) copiază textul din sursa, inclusiv '\0', în tabloul dest. strcat(dest, sursa) adaugă sursa după textul deja existent în dest.

Niciuna nu verifică dacă destinația are loc. Dacă textul nu încape, se scrie peste memoria vecină: una dintre cele mai cunoscute surse de erori și vulnerabilități (buffer overflow).

strncpy(dest, sursa, n) copiază cel mult n caractere. Dacă sursa este mai lungă, nu adaugă '\0', așa că trebuie să-l pui tu. În C++ modern, std::string rezolvă toate aceste probleme.

Parametri

Parametru Descriere
destinatie Tabloul în care se scrie; trebuie să aibă loc pentru tot textul și '\0'.
sursa Șirul copiat sau adăugat.
n Pentru strncpy: numărul maxim de caractere copiate.

Ce returnează

Pointerul destinatie.

Exemple

Exemplul 1: Copiere și lipire

#include <cstdio>
#include <cstring>

int main() {
    char nume_complet[40];
    std::strcpy(nume_complet, "Ana");
    std::strcat(nume_complet, " ");
    std::strcat(nume_complet, "Popescu");
    std::printf("%s (%zu caractere)\n", nume_complet, std::strlen(nume_complet));
}

Rezultat

Ana Popescu (11 caractere)

Exemplul 2: strncpy și terminatorul

Sursa are mai mult de 7 caractere, așa că strncpy nu pune '\0'; îl adăugăm noi pe ultima poziție.

#include <cstdio>
#include <cstring>

int main() {
    char scurt[8];
    std::strncpy(scurt, "Constanta", sizeof(scurt) - 1);
    scurt[sizeof(scurt) - 1] = '\0';
    std::printf("[%s]\n", scurt);
}

Rezultat

[Constan]

Greșeli frecvente

  • Copiezi un text mai lung decât tabloul: char s[5]; strcpy(s, "Timișoara"); scrie dincolo de tablou (comportament nedefinit, posibilă vulnerabilitate).
  • Uiți că strncpy nu pune '\0' când sursa e prea lungă.
  • Folosești strcat pe un tablou neinițializat: funcția caută întâi '\0' din destinație, care poate fi oriunde. Pornește cu strcpy sau cu dest[0] = '\0'.

Comenzi înrudite

  • std::strlen: Returnează lungimea unui șir C, numărând octeții până la terminatorul \0.
  • std::string::append: Adaugă text la sfârșitul șirului, la fel ca +=, cu variante pentru bucăți și caractere repetate.
  • std::snprintf: Scrie text formatat ca printf într-un tablou de char, fără să-i depășească mărimea.
  • std::memcpy: Copiază n octeți dintr-o zonă de memorie în alta; memmove permite zone suprapuse.