Citirea șirurilor de caractere

Pentru a înțelege modurile în care putem citi un șir de caractere (de la tastatură), este important să avem în minte noțiunea de caractere albe.

Caracterele albe sunt acele caractere care apar pe ecran sub forma unui spațiu liber. Printre aceste caractere albe se numără cel mai adesea caracterul spațiu, sfârșitul de linie (enter), sau tab-ul.

În funcție de conținutul șirului de caractere, fie că el conține aceste spații libere, sau nu, citirea lui se poate face în mai multe feluri.

Citirea unui șir fără caractere albe

Un șir de caractere care nu conține caractere albe se citește ca o variabilă simplă.

char s[10];
cin >> s;

Citirea folosind funcția cin se oprește atunci când un caracter alb este introdus la tastatură. De aceea, șirul citit va conține toate caracterele introduse până la tastarea oricărui caracter alb.

Deși această variantă de citire este mai ușor de reținut și folosit, ea nu este recomandată, chiar dacă vom ști cu siguranță că șirul nu conține acele spații libere care opresc citirea.

Depășirea numărului de caractere specificat la declararea șirului poate genera un overflow al memoriei, implicit citirea invalidă a șirului nostru (nu îl vom putea folosi / va bloca execuția programului deoarece nu există o marcă de sfârșit de șir la finalul acestuia).


Citirea unui șir cu caractere albe

Funcția specifică citirii unui șir de caractere cu spații (un text) este următoarea:

cin.get(sir_citit, nr_maxim_caractere);

Această funcție nu doar că este mai sigură și previne problemele specificate anterior, dar limitează citirea până la nr_maxim_caractere - 1 caractere, pentru a fi siguri că șirul conține o marcă de sfârșit de șir indiferent dacă noi dorim să citim mai multe caractere decât ar încăpea.

Exemplul anterior, adaptat la noua funcție, ar fi:

char s[10];
cin.get(s, 10); // maxim 9 caractere introduse de la tastatura + marca

Funcția cin.get() se oprește la introducerea caracterului enter. Mare atenție, chiar dacă acest enter nu este inclus în șir, el rămâne în buffer-ul citirii. Mai multe detalii în următoarea secțiune.

Pentru a nu ne încurca de acest enter pierdut în buffer, putem folosi o altă funcție asemănătoare:

cin.getline(sir_citit, nr_maxim_caractere);

Funcția getline() este utilă pentru citirea liniilor (într-un fișier), sau a propozițiilor întregi. Citirea se oprește tot după tastarea enter.

char s[10];
cin.getline(s, 10);

Citirea mai multor șiruri

Dacă dorim să citim mai multe șiruri de caractere consecutiv, trebuie să avem grijă la buffer-ul citirii, pentru a nu ne împiedica de caractere rămase acolo, precum enter după folosirea funcțiilor de citire cin, sau cin.get().

Pentru a elibera buffer-ul, putem apela funcția cin.get() fără argumente, între două astfel de citiri. Spre exemplu:

char s1[21], s2[31];
cin.get(s1, 21);
cin.get(); // eliberam bufferul
cin.get(s2, 31);

Fără apelul pentru eliberare, în șirul s2 nu vom apuca să scriem nimic, deoarece caracterul enter rămas va finaliza imediat citirea, fără să apucăm să memorăm nimic altceva.

În paralel, folosind funcția cin.getline(), citirea șirurilor de caractere ar deveni:

char s1[21], s2[31];
cin.getline(s1, 21);
cin.getline(s2, 31);

Dacă înaintea citirii cu cin.getline() citim alte variabile, în continuare va trebui să ne asigurăm că eliberăm citirea.

int i;
char s[10];
cin >> i; // citirea unui numar intreg
cin.get() // bufferul trebuie eliberat
cin.getline(s, 10); // citirea se realizeaza corect