Teoriechevron_rightȘiruri de Caractere

Teorie: Șiruri de Caractere

Reprezentarea textului în C++. Diferența dintre char[] și std::string. Funcții utile din cstring.

Nivel: Mediuschedule 40 min

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

code1. Ș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";

input2. 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);

build3. 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țieDescriere ș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 alfabetic
if(strcmp(a, b) == 0) // ...

warningCapcane frecvente la Bacalaureat

  • Atribuirea directă e interzisă pentru char[]: Nu poți face s1 = s2; sau s1 = "Ceva"; (doar la inițializare pe aceeași linie cu declararea). Pentru a schimba valoarea unui `char[]` ulterior, trebuie să folosești strcpy(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 cu cin.getline(s, 100);, funcția getline va citi caracterul "Enter" rămas de la număr și șirul va fi gol. Pune mereu un cin.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';
syncSe încarcă statusul...