De ce contează?
Gândește-te la tastatura ta: fiecare tastă trimite calculatorului un număr, nu un
desen. Litera „A" pe care o vezi pe ecran este, în memorie, doar numărul 65. Tipul
char este exact asta — un număr mic care, la afișare, se transformă într-un simbol.
Ce este tipul char?
char este tipul care reține un singur caracter: o literă, o cifră, un spațiu,
un semn de punctuație. Trucul pe care trebuie să-l înțelegi: în interior, char
este un număr întreg mic (1 octet). Fiecărui caracter îi corespunde un cod
numeric stabilit prin tabela ASCII.
Pentru că un char este un număr, poți face aritmetică cu el. 'A' + 1 dă codul
lui 'B', iar '5' - '0' dă valoarea 5. Asta e cheia majorității problemelor cu
caractere.
Câteva coduri ASCII pe care merită să le ții minte:
| char | '0' | '9' | 'A' | 'Z' | 'a' | 'z' | ' | ' |
| cod | 48 | 57 | 65 | 90 | 97 | 122 | 32 |
De ce contează aceste coduri
Trei relații rezolvă aproape orice:
- Cifra dintr-un caracter:
c - '0'transformă'7'în numărul 7 (pentru că'0'..'9'au coduri consecutive). - Poziția în alfabet:
c - 'a'dă 0 pentru'a', 1 pentru'b', ... 25 pentru'z'. - Mic ↔ mare: litera mică e cu 32 mai mare decât cea mare, deci
c - 32transformă o literă mică în mare, iarc + 32invers.
Implementare C++
#include <iostream>
using namespace std;
int main() {
char c = 'A';
cout << c << endl; // A
cout << (int)c << endl; // 65, codul ASCII
char cifra = '7';
int valoare = cifra - '0'; // transforma caracterul in numar
cout << valoare << endl; // 7
char mic = 'g';
char mare = mic - 32; // litera mica devine mare
cout << mare << endl; // G
return 0;
}Verificări utile pe un char
Le poți scrie singur, din coduri, sau folosi funcțiile din <cctype>:
#include <iostream>
#include <cctype>
using namespace std;
int main() {
char c = 'k';
cout << (c >= 'a' && c <= 'z') << endl; // 1 = e litera mica
cout << isdigit('5') << endl; // nenul = e cifra
cout << (char)toupper('k') << endl; // K
return 0;
}Complexitate
| Operație | Timp | Spațiu |
|---|---|---|
| Citire / afișare un char | O(1) | O(1) |
Aritmetică pe char (c - '0' etc.) | O(1) | O(1) |
Patru capcane des întâlnite:
'0'≠0. Caracterul'0'are codul 48; dacă uiți să scazi'0', obții 48 în loc de 0.cin >> csare peste spații și newline. Dacă vrei să citești inclusiv spațiile (de exemplu dintr-o propoziție), foloseștecin.get(c)saugetline.signed charse sucește la 127. Pe majoritatea sistemelorchare cu semn: adunând prea mult, codul trece în negativ. Pentru coduri > 127 foloseșteunsigned charsauint.- Gaura dintre
'Z'(90) și'a'(97). Literele mari și mici NU sunt lipite; între ele sunt 6 simboluri. Nu presupune că'Z' + 1 == 'a'.
Recapitulare
charreține un singur caracter și, în memorie, este un cod numeric (ASCII).- Aritmetica pe coduri rezolvă conversiile:
c - '0'(cifră),c - 'a'(poziție),± 32(caz). - Atenție la diferența
'0'vs0și la faptul căcin >>ignoră spațiile.