std::isalpha în C++

Verifică tipul unui caracter: literă, cifră, spațiu, majusculă, minusculă sau punctuație.

Sintaxă
#include <cctype>
int isalpha(int c);  // literă
int isdigit(int c);  // cifră
int isalnum(int c);  // literă sau cifră
int isspace(int c);  // spațiu alb
int isupper(int c);  // literă mare
int islower(int c);  // literă mică
int ispunct(int c);  // punctuație

Ce face std::isalpha

Funcțiile din <cctype> primesc un caracter și răspund la o întrebare: isalpha (literă a–z, A–Z), isdigit (cifră 0–9), isalnum (literă sau cifră), isspace (spațiu, tab, rând nou), isupper / islower (literă mare / mică), ispunct (semne precum . , ! ? ; -).

Returnează un int: diferit de zero pentru „da” (nu neapărat 1) și 0 pentru „nu”. Se folosesc direct în condiții: if (std::isdigit(c)).

Lucrează cu un singur octet. Literele românești ă, î, ș, ț au câte doi octeți în UTF-8 și nu sunt recunoscute ca litere. Important: un char cu valoare negativă (cum sunt octeții diacriticelor) trebuie convertit la unsigned char înainte, altfel comportamentul este nedefinit.

Parametri

Parametru Descriere
c Caracterul verificat, convertit la unsigned char (sau EOF).

Ce returnează

Un int diferit de zero dacă răspunsul este „da”, altfel 0.

Exemple

Exemplul 1: Statistica unui text

#include <cctype>
#include <iostream>
#include <string>

int main() {
    std::string text = "Parola123, a lui Ion!";
    int litere = 0, cifre = 0, spatii = 0, mari = 0, punctuatie = 0;
    for (unsigned char c : text) {
        if (std::isalpha(c)) ++litere;
        if (std::isdigit(c)) ++cifre;
        if (std::isspace(c)) ++spatii;
        if (std::isupper(c)) ++mari;
        if (std::ispunct(c)) ++punctuatie;
    }
    std::cout << "litere " << litere << ", cifre " << cifre << ", spații " << spatii
              << ", majuscule " << mari << ", punctuație " << punctuatie << '\n';
}

Rezultat

litere 13, cifre 3, spații 3, majuscule 2, punctuație 2

Exemplul 2: Validarea unei parole

#include <cctype>
#include <iostream>
#include <string>

bool parola_buna(const std::string& p) {
    bool mare = false, mica = false, cifra = false;
    for (unsigned char c : p) {
        if (std::isupper(c)) mare = true;
        if (std::islower(c)) mica = true;
        if (std::isdigit(c)) cifra = true;
    }
    return p.size() >= 8 && mare && mica && cifra;
}

int main() {
    for (std::string p : {"parola", "Parola2026", "PAROLA2026", "Ab1"}) {
        std::cout << p << ": " << (parola_buna(p) ? "bună" : "slabă") << '\n';
    }
}

Rezultat

parola: slabă
Parola2026: bună
PAROLA2026: slabă
Ab1: slabă

Exemplul 3: Diacriticele nu sunt litere pentru isalpha

„Iași” are 4 litere, dar „ș” ocupă doi octeți, iar niciunul nu este considerat literă.

#include <cctype>
#include <iostream>
#include <string>

int main() {
    std::string oras = "Iași";
    int litere = 0, alnum = 0;
    for (unsigned char c : oras) {
        if (std::isalpha(c)) ++litere;
        if (std::isalnum(c)) ++alnum;
    }
    std::cout << oras << ": " << oras.size() << " octeți, isalpha a numărat " << litere
              << ", isalnum " << alnum << '\n';
}

Rezultat

Iași: 5 octeți, isalpha a numărat 3, isalnum 3

Greșeli frecvente

  • Dai direct un char cu diacritice: std::isalpha(s[i]). Pe platformele unde char are semn, octeții UTF-8 sunt negativi, iar rezultatul este nedefinit. Scrie std::isalpha(static_cast<unsigned char>(s[i])).
  • Compari rezultatul cu true sau 1: if (std::isdigit(c) == 1) poate fi fals chiar pentru o cifră, pentru că „da” poate fi orice valoare diferită de zero.

Comenzi înrudite

  • std::toupper: Transformă o literă în majusculă (toupper) sau minusculă (tolower); restul rămân neschimbate.
  • std::string::find_first_of: Caută primul sau ultimul caracter dintr-un set, sau primul caracter care nu e în set.
  • std::istream::peek: Arată următorul caracter din intrare fără să-l consume.
  • std::regex: O expresie regulată compilată, folosită pentru verificarea, căutarea și înlocuirea textului.