Ce vei învăța astăzi?
După această lecție vei ști să declari un șir de caractere (adică să rezervi în memorie un spațiu pentru caractere) în C++, să-l citești de la tastatură în ambele variante (fără și cu spații) și să-l afișezi pe ecran.
Declararea unui șir de caractere
Definiție: Un șir de caractere se declară ca un vector de caractere (un tablou ale cărui elemente sunt caractere, așezate unul după altul): char s[101];. Dimensiunea 101 permite stocarea a maximum 100 de caractere plus caracterul terminator '\0'.
Analogia: cutia de scrisori
Declararea char s[101] este ca și cum ai cumpăra o cutie cu 101 de sertare: în primele sertare pui literele, iar ultimul sertar (sau primul sertar gol) îți spune unde se termină cuvântul. Până nu pui nimic în cutie, ea poate conține „resturi" din cutii vechi.
#include <iostream>
using namespace std;
int main()
{
char s1[101]; // șir neinițializat (gol)
char s2[101] = "BAC"; // șir inițializat cu text
cout << s2 << endl; // afișează: BAC
return 0;
}
Ce învățăm: la declararea cu text, terminatorul '\0' este adăugat automat de compilator la sfârșitul textului.
Citirea șirurilor de la tastatură
În C++ există două metode principale de citire a unui șir:
| Metodă | Ce citește | Când o folosim |
|---|---|---|
cin >> s |
doar un cuvânt (până la spațiu) | cuvinte, fără spații |
cin.getline(s, 101) |
întreaga linie, inclusiv spațiile | propoziții, texte |
Exemplu ghidat: citirea unei linii cu spații
#include <iostream>
using namespace std;
int main()
{
char s[101];
cin.getline(s, 101);
cout << "Textul citit este: " << s << endl;
return 0;
}
Observă: cu cin >> s din intrarea Ana are mere am citi doar Ana. Cu cin.getline(s, 101) citim întreaga linie.
Citirea mixtă: cuvânt + linie
Dacă citim mai întâi un număr sau un cuvânt cu cin și apoi o linie cu cin.getline, în intrare rămâne caracterul Enter. Îl eliminăm cu cin.ignore() înainte de cin.getline.
Exemplu ghidat: cuvânt și apoi o propoziție
#include <iostream>
using namespace std;
int main()
{
char cuvant[101];
char text[101];
cin >> cuvant;
cin.ignore();
cin.getline(text, 101);
cout << "Cuvantul: " << cuvant << endl;
cout << "Textul: " << text << endl;
return 0;
}
Observă: fără cin.ignore(), cin.getline ar citi doar Enter-ul rămas în intrare și text ar rămâne gol.
Exercițiu de completare
Completează enunțul despre citirea șirurilor:
Un șir de caractere se declară cu tipul ______. Pentru a citi un cuvânt fără spații folosim operatorul ______, iar pentru a citi o linie întreagă, cu spații, folosim funcția ______. Afișarea se face cu ______.
Bancă de cuvinte:
Exercițiu de completare a codului
Completează programul care citește și afișează un text:
Bancă de cuvinte:
Test de înțelegere
Test rapid - declararea și citirea șirurilor:
1. Care instrucțiune citește o întreagă linie, inclusiv spațiile?
2. Ce înseamnă char s[101]?
3. La ce folosește cin.ignore() înainte de cin.getline?
cin >> n, Enter-ul rămas în buffer este preluat greșit de cin.getline; la citirea mixtă număr + text, apelează cin.ignore() înainte de cin.getline, altfel linia este citită goală.Aprofundare
Cazuri particulare și detalii avansate:
- De ce exact 101 poziții?
char s[101]reține maximum 100 de litere plus terminatorul'\0'. Dacă ai nevoie de 1000 de caractere, declarichar s[1001]. cin >> soprește citirea la primul spațiu, tab sau Enter. Din intrareaAna are merecitește doarAna. De aceea, pentru texte folosimcin.getline(s, 101).cin.ignore()după citirea cucin: dacă citești întâi un număr sau un cuvânt și apoi o linie, în buffer rămâne Enter-ul;cin.ignore()îl elimină înainte decin.getline.- Șirul neinițializat conține valori oarecare. Un
char s[101]fără inițializare poate avea resturi din memorie; de aceea șirurile declarate și apoi citite primesc terminatorul automat din funcțiile de citire. - Caracterul Enter nu ajunge în șir: funcția
cin.getlinecitește caracterele și adaugă singură terminatorul'\0'la final.
La BAC, pentru problemele în care textul poate conține spații, regula de aur este: cin.getline pentru întreaga linie și cin pentru un singur cuvânt. Alegerea metodei de citire influențează direct corectitudinea programului.
PbInfo - Cuvântul
Enunț:
Cerință: Se citește un cuvânt s. Să se afișeze cuvântul de două ori pe aceeași linie, separate printr-un spațiu.
Date de intrare:
Programul citește de la tastatură cuvântul s.
Date de ieșire:
Programul va afișa cuvântul, un spațiu și cuvântul din nou.
Restricții și precizări:
Cuvântul are cel mult 100 de caractere și nu conține spații.
Exemplu:
Intrare:
bac
Ieșire:
bac bac
Cum gândim soluția:
- Declarăm
char s[101]și citim cuvântul cucin >> s - Afișăm cu
cout:s, un spațiu și din nous
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
using namespace std;
int main()
{
char s[101];
cin >> s;
cout << s << " " << s;
return 0;
}
Ce învățăm: cout << s afișează tot șirul dintr-o dată; putem afișa același șir de mai multe ori.
PbInfo - Textul cu spații
Enunț:
Cerință: Se citește un text care poate conține spații. Să se afișeze textul între paranteze drepte: [text].
Date de intrare:
Programul citește de la tastatură textul, pe o singură linie.
Date de ieșire:
Programul va afișa textul între paranteze drepte.
Restricții și precizări:
Textul are cel mult 100 de caractere și poate conține spații.
Exemplu:
Intrare:
Informatica e usoara
Ieșire:
[Informatica e usoara]
Cum gândim soluția:
- Citim întreaga linie cu
cin.getline(s, 101) - Afișăm
[, șirulsși]
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
using namespace std;
int main()
{
char s[101];
cin.getline(s, 101);
cout << "[" << s << "]";
return 0;
}
Ce învățăm: doar cin.getline reține și spațiile; cin >> s s-ar opri la primul spațiu.
Exercițiul Practic: citirea și afișarea textului
Sarcini de lucru
Completează următoarele sarcini pentru a exersa declararea, citirea și afișarea șirurilor
Sarcina 1: Salutarea
Cerință: Scrie un program C++ complet care citește numele unui elev (un singur cuvânt) și afișează mesajul Salut, <nume>!. Pentru intrarea Maria se afișează Salut, Maria!
Soluție pentru Sarcina 1:
#include <iostream>
using namespace std;
int main()
{
char nume[101];
cin >> nume;
cout << "Salut, " << nume << "!";
return 0;
}
Verifică: pentru intrarea Maria, programul afișează Salut, Maria!
Sarcina 2: Cuvânt și text
Cerință: Scrie un program C++ complet care citește mai întâi un cuvânt, apoi o propoziție (cu spații) și le afișează pe linii separate. Folosește cin.ignore() între cele două citiri.
Soluție pentru Sarcina 2:
#include <iostream>
using namespace std;
int main()
{
char cuvant[101];
char text[101];
cin >> cuvant;
cin.ignore();
cin.getline(text, 101);
cout << cuvant << endl;
cout << text << endl;
return 0;
}
Verifică: pentru intrarea bac și examenele incep luni, se afișează ambele linii corect.