Pe scurt
Operațiile uzuale pe șiruri sunt lungimea, concatenarea, extragerea unei părți, căutarea și modificarea. La Bac, șirul se poate memora în char s[10]="ana", cu terminatorul '\0'. strlen(s) dă 3, iar strcat(s,"!") schimbă textul în „ana!”, dacă tabloul are spațiu suficient. strstr(s,"na") indică începutul subșirului la poziția 1.
În detaliu
Operațiile uzuale pe șiruri sunt: lungimea, concatenarea, compararea, căutarea, extragerea, inserarea și eliminarea unei părți. Pentru tablouri char[] terminate cu '\0', funcțiile din <cstring> sunt: strlen (lungimea), strcpy (copiere), strcat (concatenare, cu destinație suficient de mare), strcmp (comparare lexicografică, prin semnul rezultatului), strchr (prima apariție a unui caracter) și strstr (prima apariție a unui subșir). Ultimele două întorc un pointer la potrivire sau NULL dacă nu există; poziția se obține scăzând adresa de început, strstr(s, "na") - s. Pentru clasa std::string din C++ există operatorul +, metodele substr, find, insert și erase, iar o căutare nereușită întoarce constanta string::npos.
Exemplul 1 — funcțiile din <cstring>.
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char s[30] = "ana", t[30] = "are";
strcat(s, "!");
cout << strlen(s) << " ";
cout << (strcmp(s, t) < 0) << " ";
char *p = strstr(s, "na");
cout << (p - s);
return 0;
}
După strcat, textul s este ana!, cu lungimea 4. Comparația ana! cu are dă un rezultat negativ, deci expresia este 1. Subșirul na începe la poziția 1. Se afișează 4 1 1.
Exemplul 2 — ștergerea unui caracter. Caracterul n din ana! se găsește cu strchr(s, 'n'), care întoarce pointerul la poziția 1. Pentru a-l șterge se mută spre stânga sufixul care începe după el, împreună cu terminatorul: memmove(p, p + 1, strlen(p)). Din ana! rezultă aa!. Funcția memmove este potrivită când zonele se suprapun; strcpy cu zone suprapuse are comportament nedefinit. Inserarea merge invers: se mută sufixul spre dreapta într-un tablou suficient de mare, apoi se copiază textul nou; din ana cu r inserat la poziția 1 rezultă arna.
Exemplul 3 — std::string. Pentru s = "informatica", s.erase(2, 3) șterge trei caractere începând de la poziția 2 (for) și lasă inmatica. Apoi s.insert(1, "xy") introduce xy înaintea poziției 1 și dă ixynmatica. Căutarea s.find("ma") întoarce 4, iar s.find("zz") întoarce string::npos. Extragerea s.substr(1, 3) dă xyn: 3 caractere începând de la poziția 1.
string s = "informatica";
s.erase(2, 3);
s.insert(1, "xy");
cout << s << " " << s.find("ma") << " " << s.substr(1, 3);
Secvența afișează ixynmatica 4 xyn.
Compararea lexicografică. Două texte se compară caracter cu caracter, de la început, până la prima diferență; ordinea este cea a codurilor. De aceea "ana" precede "are", iar "are" precede "ba". Un text care este prefix al altuia este mai mic: "ana" precede "anana". Majusculele au coduri mai mici decât minusculele, deci "Ana" precede "ana". Extragerea unui subșir din char[] se face cu strncpy și cu terminator pus explicit: strncpy(t, s + 1, 2); t[2] = '\0'; pune în t textul na, adică două caractere din ana!, începând de la poziția 1.
Exemplul 4 — inversarea unui șir cu doi indici. Se inversează textul informatica prin schimbarea caracterelor de la capete, mergând spre mijloc:
char s[30] = "informatica";
int i = 0, j = strlen(s) - 1;
while (i < j) {
swap(s[i], s[j]);
++i;
--j;
}
cout << s;
Inițial și . Se fac cinci schimburi, cu perechile de poziții , , , și ; apoi , condiția devine falsă și caracterul din mijloc rămâne pe loc. Se afișează acitamrofni. Numărul de schimburi este pentru un text de lungime , deci timpul este proporțional cu și nu este nevoie de un al doilea tablou. Dacă textul are lungimea 1 sau 0, condiția este falsă de la început și șirul rămâne neschimbat.
Palindromul. Un text este palindrom dacă se citește la fel în ambele sensuri. Se compară caracterele aflate pe poziții simetrice, cu aceiași doi indici, și se oprește la prima nepotrivire: ana este palindrom, anna este palindrom, iar ane nu este, deoarece a diferă de e.
Pentru admitere
Într-un exercițiu cu operații succesive, scrie șirul după fiecare apel. Metoda erase(p, k) șterge caractere începând la , nu până la indicele ; substr(p, k) extrage caractere începând la , nu până la poziția . La find, o căutare nereușită întoarce constanta string::npos; compară rezultatul cu string::npos, nu cu . La char[], strcat și strcpy cer destinație cu loc pentru rezultat și pentru terminator, altfel scriu dincolo de tablou. Rezultatul lui strcmp se interpretează numai prin semn, iar două texte sunt egale dacă și numai dacă rezultatul este 0.
Exemplu în formatul examenului. Ce se afișează în urma executării secvenței de mai jos?
string s = "informatica";
s.erase(2, 3);
s.insert(1, "xy");
cout << s << ' ' << s.find("ma");
- a)
ixyfrmatica 3 - b)
ixynmatica 4 - c)
ixynmatica 3 - d)
ixymatica 3
Răspunsul corect este b). Șirul informatica are literele i n f o r m a t i c a. După erase(2, 3) se șterg literele de pe pozițiile 2, 3 și 4 (f, o, r) și rămâne inmatica. După insert(1, "xy") rezultatul este ixynmatica. În el subșirul ma începe pe poziția 4, numărând de la 0: i, x, y, n, apoi m. Varianta c) greșește poziția cu o unitate, iar varianta d) șterge un caracter în plus.
Al doilea exemplu în formatul examenului. Ce se afișează în urma executării secvenței de mai jos?
char s[20] = "abcde", t[20] = "xy";
strcat(t, s + 2);
cout << t << ' ' << strlen(t);
Răspunsul este xycde 5. Expresia s + 2 este adresa caracterului de pe poziția 2, deci denotă textul cde. Funcția strcat îl lipește la sfârșitul lui t, iar lungimea devine . Tabloul t are loc pentru cele 5 caractere și terminator. Dacă t ar fi declarat char t[4], strcat ar scrie dincolo de tablou și comportamentul ar fi nedefinit.
Greșeli frecvente
- Greșit:
erase(p, k)șterge caracterele până la indicelek.Corect: ștergekcaractere începând de la pozițiap. - Greșit:
findîntoarce -1 când nu găsește.Corect: întoarcestring::npos, valoare care se compară custring::npos. - Greșit:
strcatmărește singur tabloul destinație.Corect: destinația trebuie declarată suficient de mare.
Testează-te pe această lecție
Lecția o citești aici, fără cont. Testele pe lecții și capitole sunt în cont, cu grile originale Didaxis și explicația fiecăreia: gratuit 10 grile pe zi, fără limită cu Premium, 49 de lei pe lună pentru fiecare copil.
Înainte și după
Surse și referințe
Redactare proprie, conform programei:
- OMECI 5099/2009, anexa 5, Informatică, p. 4–5, clasa X intensiv; rocnee.eu
- OMECI 5099/2009, anexa 5, Informatică, p. 4–5, clasa XI; plan de încadrare: OMEC 7723/2024, anexa 2, tabelele 1–25, legislatie.just.ro; filiera tehnologică: OMEC 7724/2024, anexa 4, tabelul calificării, legislatie.just.ro
- UNSTPB, Regulament admitere licență 2026, Anexa II-1.2 p. Anx II-14 și Anexa XI-3 p. Anx XI-6–7 (PDF p. 64, 120–121); admitere.pub.ro
- OMECTS 4800/2010, anexa 2, Informatică, p. 3–4; edu.ro
Documente consultate
- UNSTPB, admitere 2026, anexa XI-3, p. Anx XI-6–7
- Programa școlară de informatică, clasa a XI-a (OMECI 5099/2009, anexa 5), CNCE; rocnee.eu
- Programa de bacalaureat la informatică, matematică-informatică (anexa 2 la OMECTS 4800/2010), Ministerul Educației, p. 3–4; edu.ro
- Subiectele și baremele Bacalaureatului 2026; subiecte2026.edu.ro
Desene: Redactare proprie (desen original), conform Programa școlară de informatică, clasa a XI-a (OMECI 5099/2009, anexa 5), CNCE; rocnee.eu
