Caractere și cifre în C++: char și coduri ASCII
Înțelege diferența dintre caractere și numere în C++. Numără cifrele unui text cu char[] și std::string, cu exemple, limite și explicații vizuale.
În acest material
Un caracter poate fi o literă, o cifră, un semn de punctuație sau un spațiu. Tipul char păstrează o unitate de cod de dimensiunea unui octet C++. Pentru exemplele acestei lecții folosim text ASCII, astfel încât fiecare simbol din enunț ocupă un singur element.
Recapitulează variabilele și tipurile și parcurgerea tablourilor. Nu confunda caracterul '7' cu numărul 7. Primul descrie un simbol din text, al doilea poate participa direct la calcule numerice.
Ghilimelele schimbă tipul valorii
Scriem 'A' între apostrofuri pentru un caracter și "A" între ghilimele pentru un șir de caractere. Un literal șir conține și terminatorul nul, despre care discutăm în lecția următoare. ' ' este un spațiu; '0' este cifra zero; '\0' este caracterul nul. Sunt trei valori diferite.
Pe sistemele care folosesc ASCII, '0' are codul 48, '7' codul 55, iar 'A' codul 65. Nu trebuie să memorezi aceste coduri pentru a recunoaște cifre. Testează direct dacă un caracter este între '0' și '9'. Cifrele zecimale au coduri consecutive și în setul de caractere de bază cerut de C++.
Din caracter în număr: verificăm cifra, apoi calculăm c - '0'.
Din simbol în valoare numerică
După verificarea c >= '0' && c <= '9', expresia c - '0' produce valoarea cifrei. Pentru '7', rezultatul este 7. Operația se aplică unei singure cifre, nu transformă automat un text precum "472" în numărul 472.
În sens invers, pentru un întreg x între 0 și 9, caracterul corespunzător poate fi obținut din '0' + x, convertit la char. Înaintea oricărei transformări verifică domeniul permis: caracterul 'x' nu devine o cifră validă doar pentru că poți calcula diferența dintre coduri.
Numărăm cifrele dintr-o linie
Citim o linie de cel mult 200 de caractere ASCII imprimabile, inclusiv spații. Afișăm numărul cifrelor și suma valorilor lor. Pentru Ana are 12 mere si 3 pere., rezultatul este 3 6: există trei simboluri cifră, cu valorile 1, 2 și 3. Nu calculăm suma numerelor 12 și 3.
Varianta cu tablou clasic char[]
Rezervăm 201 poziții: cel mult 200 pentru text și una pentru \0. cin.getline păstrează spațiile, consumă sfârșitul de linie și adaugă terminatorul. Bucla se oprește când îl întâlnește; terminatorul nu face parte din textul prelucrat.
#include <iostream>
int main() {
char s[201]{};
std::cin.getline(s, 201);
int numar = 0, suma = 0;
for (int i = 0; s[i] != '\0'; ++i) {
if (s[i] >= '0' && s[i] <= '9') {
++numar;
suma += s[i] - '0';
}
}
std::cout << numar << ' ' << suma << '\n';
return 0;
}
Varianta cu std::string
Containerul își gestionează dimensiunea. Folosim std::getline pentru aceeași linie și parcurgem exact elementele din text. Enunțul păstrează limita de 200 de caractere, deși această reprezentare poate stoca și linii mai lungi.
#include <iostream>
#include <string>
int main() {
std::string s;
std::getline(std::cin, s);
int numar = 0, suma = 0;
for (char c : s) {
if (c >= '0' && c <= '9') {
++numar;
suma += c - '0';
}
}
std::cout << numar << ' ' << suma << '\n';
return 0;
}
Limite și greșeli de evitat
Pentru o linie fără cifre sau pentru o linie goală afișăm 0 0. Cifra '0' mărește numărul de cifre, chiar dacă adaugă zero la sumă. Suma maximă este 1800, deci un int este suficient în limitele enunțului. Fiecare caracter este examinat o singură dată: prelucrarea are timp O(n) și doi contori de dimensiune constantă.
În varianta clasică rezervăm întreaga capacitate, iar în cea cu std::string spațiul pentru text crește cu lungimea acestuia. Exemplele presupun intrare validă și nu încearcă să repare o linie care depășește limita. În aplicații generale trebuie verificată și starea fluxului după citire.
Diacriticele în UTF-8 pot ocupa mai mulți octeți. O parcurgere prin char nu este o parcurgere generală prin litere Unicode. De aceea enunțul precizează ASCII. Pentru clasificări cu funcții precum std::isdigit, argumentul provenit dintr-un char trebuie convertit la unsigned char; aici folosim comparații directe, suficiente pentru cifre.
Exersează
- Ce rezultat produce textul
007? - Ce rezultat produce
A-2B5? - De ce
'0'nu oprește bucla clasică? - Poți transforma
"42"în numărul 42 printr-o singură scădere cu'0'?
Răspunsuri: 3 7; 2 7; bucla caută caracterul nul \0, nu cifra zero; nu, trebuie prelucrate ambele cifre și valorile lor poziționale.
Continuă cu reprezentarea și citirea textului.
Un pas mai departe
Se încarcă progresul…