Ctype.h

De la Viquipèdia, l'enciclopèdia lliure
ctype.h

TipusC header file (en) Tradueix Modifica el valor a Wikidata
Part deC standard library, Biblioteca C POSIX i Biblioteca estàndard de C++ Modifica el valor a Wikidata
Característiques tècniques
PlataformaC standard library

La classificació de caràcters C és una operació proporcionada per un grup de funcions de la biblioteca estàndard ANSI C per al llenguatge de programació C. Aquestes funcions s'utilitzen per comprovar la pertinença de caràcters a una classe concreta de caràcters, com ara caràcters alfabètics, caràcters de control, etc. S'admeten tant els caràcters d'un sol byte com els amples.[1]

Història[modifica]

Els primers programadors de llenguatge C que treballaven en el sistema operatiu Unix van desenvolupar modismes de programació per classificar caràcters en diferents tipus. Per exemple, per al conjunt de caràcters ASCII, l'expressió següent identifica una lletra, quan el seu valor és cert: [2]

('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z')

Com que això es pot expressar en diverses formulacions, es va fer desitjable introduir formes breus i estandarditzades d'aquestes proves que es col·locaven al fitxer de capçalera de tot el sistema ctype.h.

Implementació[modifica]

A diferència de l'exemple anterior, les rutines de classificació de caràcters no s'escriuen com a proves de comparació. A la majoria de biblioteques C, s'escriuen com a cerques de taules estàtiques en lloc de macros o funcions.

Per exemple, es crea una matriu de 256 nombres enters de vuit bits, disposats com a camps de bits, on cada bit correspon a una propietat particular del caràcter, per exemple, isdigit, isalpha. Si el bit d'ordre més baix dels nombres enters correspon a la propietat isdigit, el codi es podria escriure com

#define isdigit(x) (TABLE[x] & 1)

Les primeres versions de Linux utilitzaven un mètode potencialment defectuós similar a la primera mostra de codi:

#define isdigit(x) ((x) >= '0' && (x) <= '9')

Això pot causar problemes si quan la macro s'expandeix, l'expressió substituïda per x té un efecte secundari. Per exemple, si s'anomena isdigit(x++) o isdigit(run_some_program()). No és immediatament evident que l'argument a isdigit s'avaluï dues vegades. Per aquest motiu, generalment s'utilitza l'enfocament basat en taules.[3]

Visió general de les funcions[modifica]

Les funcions que operen amb caràcters d'un sol byte es defineixen al fitxer de capçalera ctype.h (cctype en C++). Les funcions que operen amb caràcters amples es defineixen al fitxer de capçalera wctype.h (cwctype en C++).[4]

La classificació s'avalua segons la localització efectiva.

Byte Ample Descripció
isalnum iswalnum comprova si l'operand és alfanumèric
isalpha iswalpha comprova si l'operand és alfabètic
islower iswlower comprova si l'operand és en minúscula
isupper iswupper comprova si l'operand és en majúscula
isdigit iswdigit comprova si l'operand és un dígit
isxdigit iswxdigit comprova si l'operand és hexadecimal
iscntrl iswcntrl comprova si l'operand és un caràcter de control
isgraph iswgraph comprova si l'operand és un caràcter gràfic
isspace iswspace comprova si l'operand és espai
isblank iswblank comprova si l'operand és un caràcter d'espai en blanc
isprint iswprint comprova si l'operand és un caràcter imprimible
ispunct iswpunct comprova si l'operand és puntuació
tolower towlower converteix l'operand en minúscules
toupper towupper converteix l'operand en majúscules
iswctype comprova si l'operand cau en una classe específica
towctrans converteix l'operand mitjançant un mapeig específic
wctype retorna una classe de caràcters àmplia per utilitzar-la amb iswctype
wctrans retorna un mapeig de transformació per utilitzar-lo amb towctrans

Referències[modifica]

  1. ISO/IEC 9899:1999 specification (en anglès). 
  2. «<cctype> (ctype.h)» (en anglès). [Consulta: 17 desembre 2023].
  3. «C ctype.h» (en anglès). [Consulta: 17 desembre 2023].
  4. «ctype.h» (en anglès americà), 06-02-2015. [Consulta: 17 desembre 2023].