Școala Româno-Britanică
Modulul 2 Clasa a X-a | C++

Ora 4: Copierea și concatenarea șirurilor

Ce vei învăța astăzi: Cum copiem un șir în altul cu strcpy (funcție care copiază un șir peste altul, cu tot cu terminator), cum lipim șiruri cu strcat (funcție care lipește un șir la sfârșitul altuia) și cum facem aceste operații manual

Rezultat practic: Scrii programe C++ care copiază șiruri cu strcpy și le unesc cu strcat, construind texte noi (Competența 3.2).

Competența 3.2 Săptămâna 6

Înainte de a începe

De ce contează? Copierea și lipirea șirurilor apar în orice program real de text: păstrarea unei copii înainte de modificare, construirea unui răspuns prin lipire sau interschimbarea cuvintelor la sortare.

Ce știi deja?

La ora 3 ai determinat lungimea cu strlen și ai parcurs șirul cu for. Pentru a copia manual șirul „BAC" într-un alt șir, de câte parcurgeri ai avea nevoie și unde s-ar așeza terminatorul ''?

Ideea-cheie: strcpy(destinatie, sursa) copiază sursa peste destinație, iar strcat(destinatie, sursa) lipește sursa la sfârșitul destinației; în ambele apeluri, primul argument este întotdeauna destinația (șirul care primește copia sau lipitura).
SINTEZĂ TEORETICĂ ȘI EXEMPLE GHIDATE

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 cu strcpy
Concatenarea cu strcat
Copierea manuală
Probleme cu șiruri lipite

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ă.

C++ - copierea unui șir
#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"

Algoritm concatenareȘiruri declară a, b ca șiruri citește a, b lipește șirul b la sfârșitul șirului a (strcat) scrie a Sfârșit algoritm
C++ - concatenarea a două șiruri
#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.

C++ - copierea manuală a unui șir
#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:
strcpy strcat cstring

Exercițiu de completare a codului

Completează programul care construiește „BAC 2026":
#include <iostream>
#include <______>
using namespace std;
int main()
{
    char a[101] = "BAC ";
    char b[101] = "2026";
    ______(a, b);
    cout << ______ << endl;
    return 0;
}
Bancă de cuvinte:
cstring strcat a

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?

Ai grijă la: ordinea argumentelor contează: 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 și b sunt identice ca text, dar sunt două zone distincte de memorie; modificarea unuia nu-l afectează pe celălalt.
  • strcat(a, b) cere spațiu în a. Rezultatul (textul lui a + textul lui b + terminator) trebuie să încapă în vectorul a; 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 lui b unul câte unul și închizi cu '\0'.
  • Nu confunda ordinea argumentelor: în strcpy(a, b) și strcat(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ă.

APLICARE ȘI REZOLVARE DE PROBLEME

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:
  1. Citim cuvântul s cu cin
  2. Copiem s într-un șir d cu strcpy
  3. Lipim s la d cu strcat
  4. 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:
  1. Citim numele în nume și prenumele în prenume
  2. Copiem prenumele în rezultat cu strcpy
  3. Lipim un spațiu, apoi numele, cu strcat
  4. 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ȚII PRACTICE

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.

Scrie pe caiet - De reținut

Titlul lecției

Ora 4: Copierea și concatenarea șirurilor

Definiția lecției

Copierea unui șir înseamnă duplicarea conținutului unui șir peste altul, cu tot cu terminator, iar concatenarea înseamnă lipirea unui șir la sfârșitul altuia. În C++ aceste operații se fac cu strcpy și strcat din biblioteca <cstring>. În ambele funcții, primul argument este destinația, adică șirul care primește rezultatul, iar al doilea este sursa. La concatenare, destinația trebuie să aibă spațiu suficient pentru șirul rezultat, altfel apare depășirea memoriei. Operațiile se pot face și manual, parcurgând șirul caracter cu caracter și adăugând terminatorul la final. Copierea și concatenarea stau la baza construirii textelor noi, de la saluturi personalizate până la răspunsuri formate din mai multe părți.

Definiții esențiale

Algoritmul cheie - pseudocod

Algoritm concatenareȘiruri declară a, b ca șiruri citește a, b lipește șirul b la sfârșitul șirului a (strcat) scrie a Sfârșit algoritm

Algoritmul cheie - cod C++

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

int main()
{
    char a[201], b[101];
    cin.getline(a, 201);
    cin.getline(b, 101);

    strcat(a, b);

    cout << a << endl;

    return 0;
}

Greșeli comune de evitat

Sfaturi practice și trucuri

Exemplu practic

Scrie un program care citește prenumele și numele unei persoane și le afișează pe aceeași linie, despărțite printr-un spațiu, folosind strcat. Pentru prenumele Ioana și numele Ionescu, programul afișează: Ioana Ionescu.

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

int main()
{
    char numeComplet[101], prenume[101], nume[101];
    cin >> prenume;
    cin >> nume;

    strcpy(numeComplet, prenume);
    strcat(numeComplet, " ");
    strcat(numeComplet, nume);

    cout << numeComplet << endl;

    return 0;
}