Pe scurt
Șirurile de caractere (string-uri) sunt structuri de date esențiale în programare, reprezentând o succesiune de caractere alfanumerice, simboluri sau spații. În limbajul C/C++, un șir de caractere este un vector de tip char, terminat cu caracterul null ('\0'), ceea ce permite funcțiilor din biblioteca standard să știe unde se termină șirul. Pentru olimpiade și Bacalaureat, este important să stăpânești atât funcțiile predefinite, cât și implementarea manuală a acestora, pentru a înțelege mecanismele interne și a rezolva probleme care necesită optimizări sau prelucrări complexe.
Definiția și structura șirurilor de caractere
Un șir de caractere (string) este un vector de tip char, terminat cu caracterul null ('\0'). Acest terminator permite funcțiilor din biblioteca standard să determine unde se termină șirul.
- Alocare statică:
char s[100];
- Alocare dinamică:
char *s = new char[n+1];
Funcții predefinite pentru prelucrarea șirurilor
Biblioteca standard <string.h> oferă funcții esențiale:
strlen(s) – determină lungimea șirului (fără terminator)
strcpy(dest, src) – copiază un șir în altul
strcat(dest, src) – concatenază (lipește) două șiruri
strcmp(s1, s2) – compară două șiruri lexicografic
strchr(s, c) – caută un caracter într-un șir
strstr(s, subsir) – caută un subșir într-un șir
Prelucrări fără funcții predefinite
Pentru a înțelege mecanismele interne, este util să implementezi manual operațiile de bază:
- Parcurgerea – cu
while sau for până la '\0'
- Copierea manuală – caracter cu caracter, adăugând
'\0' la final
- Inversarea unui șir – algoritm cu doi pointeri (unul la început, unul la sfârșit), interschimbând caracterele
- Eliminarea spațiilor – parcurgerea șirului original și copierea doar a caracterelor care nu sunt spațiu
Transformări și operații comune
- Conversia la litere mari/mici – folosind
toupper() și tolower()
- Eliminarea spațiilor multiple – păstrarea unui singur spațiu între cuvinte
- Verificarea palindromului – compararea șirului cu inversul său
- Numărarea aparițiilor unui subșir – parcurgerea și căutarea secvențială
Gestionarea memoriei
- Alocare statică – dimensiune fixă, declarată la compilare (
char s[100])
- Alocare dinamică – dimensiune stabilită la execuție (
char *s = new char[n+1])
- Evitarea depășirii capacității – asigurarea că spațiul alocat este suficient pentru datele introduse
- Asigurarea terminatorului de șir – adăugarea obligatorie a
'\0' la finalul oricărui șir construit manual
Tokenizarea (parsarea) șirurilor
Tokenizarea înseamnă separarea unui șir în componente (cuvinte, numere) după delimitatori:
- Cu funcție predefinită –
strtok(s, delimitatori)
- Implementare manuală – parcurgerea șirului și extragerea secvențelor dintre delimitatori
Aplicații frecvente în probleme
- Palindrom – verificare dacă un șir se citește la fel de la stânga la dreapta și invers
- Anagramă – verificare dacă două șiruri conțin aceleași caractere în aceeași frecvență
- Numărarea aparițiilor – a unui caracter sau subșir într-un text
- Criptare simplă – înlocuirea caracterelor după o regulă dată
- Codificare/decodificare – transformări bazate pe chei sau algoritmi specifici
Exemple practice
- Exemplul 1: Citirea și afișarea unui șir, determinarea lungimii. Se citește de la tastatură un șir de caractere (maxim 100 de caractere). Se afișează lungimea sa. Implementare:
char s[101]; cin.getline(s, 101); int n = 0; while(s[n] != '\0') n++; cout << n;.
- Exemplul 2: Inversarea unui șir fără funcții predefinite. Se citește un șir
s. Se creează un nou șir rezultat cu aceeași lungime, apoi se parcurge s de la sfârșit către început și se copiază caracter cu caracter în noul șir. La final, se adaugă '\0'. Exemplu: s="abc", rezultat ="cba".
- Exemplul 3: Eliminarea tuturor spațiilor dintr-un șir. Se parcurge șirul original, iar pentru fiecare caracter care nu este spațiu, se concatenează la un nou șir (sau se mută în același șir folosind un indice separat). Se adaugă terminatorul de șir la final. De exemplu,
"a b c" devine "abc".
Verifică-te!
- Care este caracterul care marchează sfârșitul unui șir de caractere în C/C++?
- Ce funcție din biblioteca standard se folosește pentru a determina lungimea unui șir?
- Cum poți inversa un șir de caractere fără a utiliza funcții predefinite din
<string.h>?