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ă
strncpynu pune'\0'când sursa e prea lungă. - Folosești
strcatpe un tablou neinițializat: funcția caută întâi'\0'din destinație, care poate fi oriunde. Pornește custrcpysau cudest[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.