Ce vei învăța astăzi?
După această lecție vei ști să copiezi un șir de caractere în altul și să concatenezi (lipești) șiruri, folosind funcțiile standard strcpy și strcat.
Copierea unui șir cu strcpy
Definiție: strcpy(destinatie, sursa) copiază conținutul șirului sursa în șirul destinatie, inclusiv terminatorul '\0'. Ordinea contează: întâi destinația, apoi sursa.
Analogia: copierea notițelor
Copierea cu strcpy este ca și cum ai scrie o notiță dintr-un caiet în altul: toate cuvintele trec în noul caiet, iar pagina din caietul nou se „termină" exact unde s-a terminat și notița din sursă.
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char sursa[101] = "BAC 2026";
char destinatie[101];
strcpy(destinatie, sursa);
cout << destinatie << endl;
return 0;
}
Ce învățăm: după strcpy, cele două șiruri sunt identice ca text, dar ocupă zone diferite din memorie.
Concatenarea cu strcat
Definiție: strcat(a, b) lipește șirul b la sfârșitul șirului a. Rezultatul rămâne în a. Șirul a trebuie să aibă spațiu suficient pentru rezultat.
Exemplu ghidat: construim cuvântul „Informatica"
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char a[101] = "Infor";
char b[101] = "matica";
strcat(a, b);
cout << a << endl;
return 0;
}
Observă: după strcat(a, b), șirul a devine Informatica. Terminatorul lui a este „înlocuit" de primul caracter al lui b.
| Operație | Sintaxă | Efect |
|---|---|---|
| Copiere | strcpy(x, y) |
x devine identic cu y |
| Concatenare | strcat(x, y) |
x devine x + y |
Copierea manuală, fără strcpy
Copierea manuală ne ajută să înțelegem cum lucrează funcția: parcurgem sursa caracter cu caracter și scriem fiecare caracter în destinație, apoi adăugăm terminatorul.
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char sursa[101] = "BAC";
char destinatie[101];
int i = 0;
while (sursa[i] != '\0')
{
destinatie[i] = sursa[i];
i++;
}
destinatie[i] = '\0';
cout << destinatie << endl;
return 0;
}
Ce învățăm: la final, destinatie[i] = '\0' este obligatoriu, altfel afișarea cu cout ar continua și după sfârșitul șirului copiat.
Exercițiu de completare
Completează enunțul despre copiere și concatenare:
Pentru a copia conținutul șirului b în șirul a folosim funcția ______. Pentru a lipi șirul b la sfârșitul șirului a folosim ______. Ambele funcții se găsesc în biblioteca ______.
Bancă de cuvinte:
Exercițiu de completare a codului
Completează programul care construiește „BAC 2026":
Bancă de cuvinte:
Test de înțelegere
Test rapid - copierea și concatenarea:
1. Ce face strcpy(x, y)?
2. După strcat(a, b), unde se află rezultatul?
3. Ce punem la sfârșitul unei copieri manuale?
strcpy(b, a) șterge conținutul lui b și îl înlocuiește cu a, exact invers față de intenție dacă citești „b ia valoarea a". Verifică mereu care este destinația și că are loc suficient, plus un loc pentru terminator.Aprofundare
Cazuri particulare și detalii avansate:
strcpy(a, b)copiază conținutul, nu adresa. După copiere,așibsunt identice ca text, dar sunt două zone distincte de memorie; modificarea unuia nu-l afectează pe celălalt.strcat(a, b)cere spațiu îna. Rezultatul (textul luia+ textul luib+ terminator) trebuie să încapă în vectorula; altfel se produce depășire de memorie (buffer overflow), o greșeală frecventă.- Copierea manuală (cu
for) este cerută la BAC pentru a dovedi înțelegerea: copiezi caracter cu caracter și adaugi terminatorul la final. - Concatenarea manuală este tot o parcurgere: ajungi la finalul lui
a, apoi copiezi caracterele luibunul câte unul și închizi cu'\0'. - Nu confunda ordinea argumentelor: în
strcpy(a, b)șistrcat(a, b), primul argument este întotdeauna destinația, al doilea sursa.
Copierea și concatenarea sunt operații de construcție a unui șir rezultat. Le folosim ori de câte ori trebuie să „asamblăm" text dintr-unul sau mai multe șiruri sursă.
PbInfo - Cuvântul dublat
Enunț:
Cerință: Se citește un cuvânt s. Să se afișeze cuvântul urmat imediat de el însuși, fără spațiu. Pentru ab se afișează abab.
Date de intrare:
Programul citește de la tastatură cuvântul s.
Date de ieșire:
Programul va afișa cuvântul concatenat cu el însuși.
Restricții și precizări:
Cuvântul are cel mult 100 de caractere.
Exemplu:
Intrare:
bac
Ieșire:
bacbac
Cum gândim soluția:
- Citim cuvântul
scucin - Copiem
sîntr-un șirdcustrcpy - Lipim
sladcustrcat - Afișăm
d
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[101];
char d[201];
cin >> s;
strcpy(d, s);
strcat(d, s);
cout << d;
return 0;
}
Ce învățăm: nu folosim strcat(s, s) (surse și destinație suprapuse); copiem întâi în alt șir, apoi lipim.
PbInfo - Numele complet
Enunț:
Cerință: Se citesc numele și prenumele unui elev (două cuvinte). Să se afișeze prenumele urmat de un spațiu și de nume, folosind concatenarea.
Date de intrare:
Programul citește de la tastatură numele și prenumele, separate printr-un spațiu.
Date de ieșire:
Programul va afișa „prenume nume".
Restricții și precizări:
Numele și prenumele au cel mult 100 de caractere fiecare.
Exemplu:
Intrare:
Pop Maria
Ieșire:
Maria Pop
Cum gândim soluția:
- Citim numele în
numeși prenumele înprenume - Copiem prenumele în
rezultatcustrcpy - Lipim un spațiu, apoi numele, cu
strcat - Afișăm rezultatul
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char nume[101], prenume[101];
char rezultat[201];
cin >> nume >> prenume;
strcpy(rezultat, prenume);
strcat(rezultat, " ");
strcat(rezultat, nume);
cout << rezultat;
return 0;
}
Ce învățăm: strcat lipeste orice text, inclusiv un spațiu dintre ghilimele; de aceea " " este un șir valid.
Exercițiul Practic: copierea și lipirea șirurilor
Sarcini de lucru
Completează următoarele sarcini pentru a exersa copierea și concatenarea
Sarcina 1: Salutul personalizat
Cerință: Scrie un program C++ complet care citește un nume și construiește, cu strcpy și strcat, mesajul Buna ziua, <nume>!. Pentru intrarea Ion se afișează Buna ziua, Ion!
Soluție pentru Sarcina 1:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char nume[101];
char mesaj[201];
cin >> nume;
strcpy(mesaj, "Buna ziua, ");
strcat(mesaj, nume);
strcat(mesaj, "!");
cout << mesaj;
return 0;
}
Verifică: pentru intrarea Ion, programul afișează Buna ziua, Ion!
Sarcina 2: Concatenare manuală
Cerință: Scrie un program C++ complet care citește două cuvinte a și b și le lipește manual (fără strcat), copiind întâi cuvântul a într-un șir rezultat, apoi cuvântul b.
Soluție pentru Sarcina 2:
#include <iostream>
using namespace std;
int main()
{
char a[101], b[101], rezultat[201];
cin >> a >> b;
int k = 0;
for (int i = 0; a[i] != '\0'; i++)
{
rezultat[k] = a[i];
k++;
}
for (int i = 0; b[i] != '\0'; i++)
{
rezultat[k] = b[i];
k++;
}
rezultat[k] = '\0';
cout << rezultat;
return 0;
}
Verifică: pentru intrările bac și ala, programul afișează bacala.