Ctype.h
Tipus | C header file (en) ![]() ![]() |
---|---|
Part de | C standard library, Biblioteca C POSIX i Biblioteca estàndard de C++ ![]() |
Característiques tècniques | |
Plataforma | C 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
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ó
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
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 |