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.
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:('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.
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++).
La classificació s'avalua segons la localització efectiva. ByteAmpleDescripcióisalnumiswalnumcomprova si l'operand és alfanumèricisalphaiswalphacomprova si l'operand és alfabèticisloweriswlowercomprova si l'operand és en minúsculaisupperiswuppercomprova si l'operand és en majúsculaisdigitiswdigitcomprova si l'operand és un dígitisxdigitiswxdigitcomprova si l'operand és hexadecimaliscntrliswcntrlcomprova si l'operand és un caràcter de controlisgraphiswgraphcomprova si l'operand és un caràcter gràficisspaceiswspacecomprova si l'operand és espaiisblankiswblankcomprova si l'operand és un caràcter d'espai en blancisprintiswprintcomprova si l'operand és un caràcter imprimibleispunctiswpunctcomprova si l'operand és puntuaciótolowertowlowerconverteix l'operand en minúsculestouppertowupperconverteix l'operand en majúsculesiswctypecomprova si l'operand cau en una classe específicatowctransconverteix l'operand mitjançant un mapeig específicwctyperetorna una classe de caràcters àmplia per utilitzar-la amb iswctypewctransretorna un mapeig de transformació per utilitzar-lo amb towctrans
Referències
Categoria:Llenguatge de programació C