Teorie: Șiruri de Caractere
Reprezentarea textului în C++. Diferența dintre char[] și std::string. Funcții utile din cstring.
Șiruri de Caractere
În C++, un șir de caractere (string) este folosit pentru a stoca text (cuvinte, propoziții). Există două modalități principale de a lucra cu text în C++: folosind tablouri de caractere (stilul limbajului C, bazat pe char[] terminat cu \0) și folosind clasa modernă std::string.
La examene precum Bacalaureatul, ambele variante sunt adesea acceptate, însă cunoașterea funcțiilor din biblioteca <cstring> pentru tablourile clasice este esențială.
1. Șiruri clasice (char[]) vs std::string
Stilul clasic C (char array)
Un vector de tip char. Atenție: Ultimul caracter stocat este mereu terminatorul de șir '\0' (NULL).
char s[101]; // Maxim 100 caractere + '\0'
char nume[] = "Ion"; // Dimensiune 4 ('I', 'o', 'n', '\0')Stilul modern (std::string)
Necesită #include <string>. Își gestionează singur memoria și este mult mai sigur și ușor de utilizat.
string s; // Șir gol
string nume = "Ion";2. Citirea de la tastatură
Citirea unui text care conține spații necesită o atenție deosebită, deoarece operatorul standard cin >> se oprește la primul spațiu alb întâlnit.
Citim un singur cuvânt (fără spații)
char cuvant[50];
cin >> cuvant; // Dacă scriem 'Salut Lume', va citi doar 'Salut'Citim o linie întreagă (cu spații) pentru char[]
Folosim metoda cin.get() sau cin.getline().
char propozitie[100];
// Citeste maxim 99 caractere pana la '\n' (Enter)
cin.getline(propozitie, 100);Citim o linie întreagă (cu spații) pentru std::string
Folosim funcția globală getline(cin, s).
string propozitie;
getline(cin, propozitie);3. Funcții esențiale din <cstring>
Pentru a manipula tablourile de caractere (char[]), se includ funcțiile din biblioteca #include <cstring>. Iată cele mai importante 4 funcții pentru Bacalaureat:
| Funcție | Descriere și Exemplu |
|---|---|
| strlen(s) | Returnează lungimea șirului (numărul de caractere), fără a număra și terminatorul \0.int len = strlen("Salut"); // len va fi 5 |
| strcpy(dest, sursa) | Copiază șirul sursa în șirul dest (suprascriind conținutul vechi).char a[20]; strcpy(a, "Test"); // a devine "Test" |
| strcat(dest, sursa) | Alătură (concatenează) șirul sursa la sfârșitul șirului dest.char a[20]="Buna"; strcat(a, " Ziua"); // a devine "Buna Ziua" |
| strcmp(s1, s2) | Compară lexicografic (alfabetic) două șiruri. Returnează: • 0 dacă șirurile sunt egale• < 0 dacă s1 < s2 alfabetic• > 0 dacă s1 > s2 alfabeticif(strcmp(a, b) == 0) // ... |
Capcane frecvente la Bacalaureat
- Atribuirea directă e interzisă pentru char[]: Nu poți face
s1 = s2;saus1 = "Ceva";(doar la inițializare pe aceeași linie cu declararea). Pentru a schimba valoarea unui `char[]` ulterior, trebuie să foloseștistrcpy(s1, "Ceva");. Erorile de genul "Array type is not assignable" sunt dese. - Eroarea
cin.get()lăsat în buffer: Dacă citești un număr (cin >> n;) și imediat după aceea citești un șir cucin.getline(s, 100);, funcția getline va citi caracterul "Enter" rămas de la număr și șirul va fi gol. Pune mereu uncin.get();între citirea numărului și a șirului pentru a consuma Enter-ul. - Terminatorul de șir: Pentru a elimina ultimul caracter dintr-un `char s[100]`, ajunge să pui terminatorul cu o poziție mai la stânga:
s[strlen(s)-1] = '\0';