În C++ există mai multe modalități de a reprezenta șirurile de caractere. În acest articol vom discuta despre șirurile de caractere reprezentate ca tablouri unidimensionale cu elemente de tip char, reprezentare care provine din limbajul C. Aceste șiruri se mai numesc null-terminated byte string (NTBS). În reprezentarea internă, după ultimul caracter (byte, octet) valid din șir se află caracterul '\0' – caracterul cu codul ASCII 0, numit și caracter nul. Astfel, pentru reprezentarea în C/C++ a cuvântului copil, care are 5 caractere, se vor folosi 6 octeți, cu valorile: 'c', 'o', 'p', 'i', 'l', '\0'.
Un șir de caractere se declară în C++ astfel:
char s[11];
S-a declarat un șir care poate memora maxim 11 caractere, cu indici 0 1 ... 10. Șirul s poate memora cel mult 10 caractere utile, după ultimul caracter util fiind memorat caracterul '\0'.
De asemenea, la declararea unui șir acesta poate fi inițializat. Următoarele exemple declară șiruri de caractere și le inițializează cu șirul "copil":
char s[11] = "copil"; // se folosesc doar 6 caractere
char t[]="copil"; // se aloca automat 6 octeti pentru sirul t: cele 5 litere si caracterul nul \0
char x[6]={'c','o','p','i','l','\0'}; // initializarea este similara cu cea a unui tablou oarecare - sirurile de caractere sunt tablouri
char z[]={'c','o','p','i','l','\0'}; // se aloca automat 6 octeti pentru sir
Se poate face cu operatorul << de inserție în stream:
cout << s << endl;
Se poate folosi operatorul >> de extracție din stream:
cin >> s;
În acest mod, datorită specificului operatorului >> nu se pot citi șiruri care conțin spații – se vor citi caracterele până la primul spațiu, fără acesta.
Pentru a citi șiruri care conțin spații, putem folosi metoda getline a obiectului cin sau alt obiect de tip istream:
istream& getline (char* s, streamsize n );
Se vor citi în șirul s caracterele din stream-ul de intrare (de la tastatură) până la apariția caracterului sfârșit de linie '\n', dar nu mai mult de n-1 caractere. Caracterul '\n' nu va fi adăugat la șirul s, dar va fi extras din stream. De exemplu:
cin.getline(s , 11);
Am putea spune că getline citește toată linia și sare peste ENTER. Iată un exemplu complet:
#include < iostream >
using namespace std;
int main(){
char nume1[31], nume2[31];
cout << "Cum te cheama? (nume, prenume) ";
cin.getline(nume1, 31);
cout << "Cum il cheama pe prietenule tau? ";
cin.getline(nume2 , 31);
cout << "Te numesti " << nume1 << endl;
cout << "Esti prieten cu " << nume2 << endl;
return 0;
}
O altă modalitate de citire a unui șir care poate conține spații este folosirea metodei get a obiectului istream, pe care nu o mai prezentăm aici.
Deoarece șirurile de caractere sunt de fapt tablouri, pentru referirea unui caracter din șir se folosește operatorul [], ca în exemplul următor:
char s[]="abac"; // sirul consta din 5 caractere: cele 4 litere si caracterul nul '\0'
cout << s[3]; // c
s[1] = 'r';
cout << s; // arac
cout << s[10]; // ??? comportament impredictibil: nu exista in sir caracter cu indice 10
În numeroase situații este necesară analizarea fiecărui caracter din șir. Pentru aceasta este necesară o parcurgere a șirului; aceasta se face similar cu parcurgerea unui tablou oarecare. Diferența constă în faptul că, pentru șirul de caractere nu se cunoaște explicit lungimea. Ea poate fi determinată cu funcția strlen (vezi mai jos), dar putem controla parcurgerea șirului știind că după ultimul caracter valid din șir apare caracterul nul '\0'.
Următoarele exemple parcurg un sir de caractere și afișează caracterele separate prin spații:
char s[11];
cin >> s; // se citeste un cuvant , fara spatii
int i = 0;
while(s[i] != '\0')
{
cout << s[i] << " ";
i ++;
}
sau mai condensat:
char s[11];
cin >> s; // se citeste un cuvant , fara spatii
for(int i = 0 ; s[i] ; i ++)
cout << s[i] << " ";
În această secțiune poți genera un rezumat al conținutului paginii folosind AI! Fii liber să folosești butonul de mai jos oricând ești pe grabă și nu ai timp să înveți tot!
În această secțiune poți întreba expertul nostru robot orice legat de nelămuririle pe care le-ai întâlnit de-a lungul lecțiilor! Fii liber să folosești butonul de mai jos oricând ai nevoie de explicații adiționale!