Siruri de caractere in C++
Ce este un caracter?
Tipurile caracter și șir de caractere pot stoca secvențe de caractere dintr-un set de caractere, cum ar fi ASCII sau UTF-8. Deoarece cele mai multe seturi de caractere includ cifre, este posibil să existe un șir numeric, cum ar fi “1234”. Cu toate acestea, mai multe limbaje ar trata acest șir ca aparținând unui tip diferit, cu valoarea numerică 1234.
Sursa: wikipedia.org
Reprezentarea unui caracter
Daca pana acum am lucrat cu tipuri de date ce lucreaza cu numere (precum int, long long, float, s.a.m.d.), de-acum in colo vom introduce un nou tip de date, tipul char. Acest tip de date a fost introdus din nevoia tehnologiei de a lucra cu litere.
Tipul de date char stocheaza numere de la 0 la 127, iar fiecarui numar ii corespunde un simbol. Pentru a vedea semnificatia fiecarui simbol, trebuie sa verificati Tabelul Ascii. De exemplu, pentru numarul 84 avem caracterul “T” iar pentru numarul 80 – caracterul “P”.
Sa luam urmatoarele linii drept exemplu:
char caracter = 84; cout << caracter;
In momentul cand atribuim un numar unui tip de date char, calculatorul converteste automat numarul in simbolul specific din tabelul Ascii. Daca am fi dorit sa stocam direct caracterul, puteam scrie urmatoarea linie:
char caracter = 'T'; cout << caracter;
Mare atentie: pentru a declara un caracter, trebuie sa il punem intre apostroafe (sau apostrofuri?). De asemenea, nu trebuie sa va faceti griji cu memorea fiecarui numar si caracter corespunzator, deoarece ne puteam folosii de urmatoarea scurtatura:
char caracter = 'T'; cout << (int) caracter;
Sau
char caracter = 'T'; int numar = caracter; cout << numar;
Cum salvezi un apostrof?
Probabil ai observat faptul ca daca vrei sa salvezi un apostrof, vei avea cateva batai de cap. In majoritatea limbajelor de programare, pentru a afisa un apostrof, trebuie sa pui un “\” (backslash) in fata apostrofului.
char apostrof = '\''; cout << apostrof;
Ce “caractere speciale” mai poti obtine folosind “\” ?
- \n – caracterul linie noua (apare la finalul fiecarei sfarsit de linie)
- \0 – caracterul null (vom vorbii imediat despre acesta)
- \\ – afiseaza caracterul “\”
- \t – caracterul tab (este caracterul ce il obtineti cand apasati tasta TAB)
- \’ – caracterul apostrof
- \” – caracterul pentru ghilimele
Caracterele albe (sau nevazute)
Un caracter alb este un caracter ASCII care poate fi vizualizat pe ecran sub forma unui spatiu liber (de exemplu, caracterele spaţiu, sfârşit de linie, tab, pagină nouă). Termenul este folosit in special in programare, dar poate fi intalnit si in lucrul cu editoarele de texte.
De exemplu, daca avem fisierul exemplu.txt ce contine urmtoarele linii:
100
Mihai scrie tutoriale!
Super tare.
El va arata in urmatorul fel, in memoria calculatorului: 100\nMihai scrie tutoriale!\n\nSuper tare.
Iniţializarea sirurilor de caractere
Un şir de caractere poate fi iniţializat la declarare astfel:
char cuvant[ ]=”tutoriale”;
In urma iniţializării, la sfârşitul cuvântului va fi adăugat caracterul \0 (codul ASCII al caracterului NULL).
Compilatorul va calcula numărul de octeţi necesari pentru memorarea cuvântului tutoriale. În acest caz tabloul conţine 10 octeţi, 9 pentru memorarea cuvântului şi 1 pentru memorarea codului caracterului NULL (adaugat automat de catre compilator).
Dar in exemplul de mai sus am memorat un vector de 15 octeti, mai mult decat sunt necesari. Ultimii 5 octeti ramanand neocupati.
Un vector care conţine un şir de caractere citit sau iniţializat în modul anterior prezentat, poate fi adresat pe componente, în mod normal. De exemplu cuvant[0]=’t’, cunvant[1]=’u’, ş.a.m.d.
Atentie: Dupa ce ati declarat un sir de caractere, nu mai puteti sa-i atribuiti un sir.
char cuvant[15]; cuvant = "tutoriale";
Lungimea unui sir de caractere reprezinta numarul de caractere din sir, mai putin caracterul NULL, iar sirul vid (sau sirul nul) este sirul care are lungimea 0.
Declararea şi memorarea vectorilor de caractere (sau sirurilor de caractere)
Şirurile de caractere sunt de fapt succesiuni de caractere. Exact cum am invatat despre vectori (int v[10];), sirurile de caractere pot fi privite ca un vector de caractere.
char cuvant[15];
Acesta este un tablou unidimensional (sau vector), care poate memora 15 elemente de tip char (caracter).
Poate fi reprezentat în memorie astfel:
Presupunând că dorim să citim, să memorăm şi să afişăm cuvântul “tutoriale”, vom scrie următorul program:
#include <iostream> using namespace std; int main() { char cuvant[15]; cout<<"Introduceti cuvantul: "; cin >> cuvant; cout<<"Cuvantul citit este: "; cout << cuvant; }
Funcţiile cin şi cout suportă şirurile de caractere terminate cu caracterul NULL, astfel pot fi citite respectiv afişate şirurile de caractere.
Putem reprezenta memorarea variabilei cuvânt astfel:
Din nefericire cu ajutorul funcţiei cin nu putem citi şiruri de cractere care conţin spaţii sau caractere albe*.
Funcţia cin procedează astfel la citirea unui şir de caractere:
- Se sar toate caracterele albe
- Se citeste şirul care începe cu primul caracter care nu este alb
- Citirea se încheie la întâlnirea primului caracter alb.
Exemplu: Pentru şirul introdus de la tastatură: “ astazi invatam de pe tutoriale-pe.net”, programul de mai sus va afişa doar “astazi”.
Pentru citirea şirurilor de caractere care conţin cuvinte separate prin spaţii sau alte caractere albe vom folosi funcţia cin.get().
Functia cin.get() – siruri de caractere
Forma simplificata: cin.get(s, nr)
Parametrii acestei functii sunt: s – un sir de caractere si nr – un numar de tip int. Efectul acestei functii este urmatorul: se citesc de la tastatura mai multe caractere, inclusiv caracterele albe, care vor fi scrise in variabila s, pana cand se produce unul dintre urmatoarele evenimente:
- au fost citite maxim nr-1 caractere
- a fost intalnit caracterul ch (al treilea parametru ce este optional). In cazul in care acest caracter ch nu este mentionat, se va considera caracterul ‘\n’ (linie noua)
Exemplu: Acum, pentru sirul introdus de la tastatura: “astazi invatam de pe tutoriale-pe.net” programul de mai jos va afisa tot textul.
char sir[45]; cin.get(sir, 45); /* Echivalent cu cin.get(sir, 45, '\n'); */ cout << sir;
Citirea caracter cu caracter
Un alt mod de citire a sirurilor, pe care nu il vei folosii foarte des este citirea caracter cu caracter. Pentru a implementa acest tip de citire trebuie mai intai sa cunoastem lungimea totala a sirului.
char cuvant[15]; int n; cin >> n; for(int i = 0; i < n; i++) cin >> cuvant[i]; cout << cuvant;
Parcurgerea unui sir de caractere
Sa spunem ca citim un sir de caracter, si dorim sa parcurgem fiecare caracter de la stanga la dreapta. Spre exemplu, putem avea o problema in care dorim sa afisam doar vocalele dintr-un sir.
char cuvant[15]; cin.getline(cuvant, 15); for(int i = 0; cuvant[i] != '\0'; i++) cout << cuvant[i] << " ";
Ce face acest for? Parcurge fiecare caracter pe rand, incepand de la indicele 0, pana cand intalneste caracterul null. In momentul in care intalneste caracterul null, for-ul nostru se opreste.
Asadar, cum putem face sa afisam doar vocalele din cuvantul citit de noi?
#include <iostream> using namespace std; bool eVocala(char caracter) { if(caracter == 'a' || caracter == 'e' || caracter == 'i' || caracter == 'o' || caracter == 'u') return true; return false; } int main() { char cuvant[15]; cin.getline(cuvant, 15); for(int i = 0; cuvant[i] != '\0'; i++) { if(eVocala(cuvant[i])) cout << cuvant[i] << " "; } return 0; }
In loc de cuvant[i] != ‘\0’ putem folosii strlen(cuvant), dar despre asta vom vorbii in urmatorul tutorial.