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:
seste șirul în care vrem să ștergem caractere;auxeste un șir auxiliar (buffer temporar);pozeste poziția de la care începem ștergerea (începând de la 0);keste 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
ncaractere îndestinatie; - dacă
sursaare mai puțin dencaractere, restul va fi completat cu caractere'\0'; - invers, dacă
sursaare mai mult dencaractere, ș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
s1ne interesează doar primele 8 caractere; s2 + 15este 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
s2să rămână intact până la finalul propoziției.