La clasificación de caracteres C es una operación proporcionado por un grupo de funciones de la biblioteca estándar ANSI C para el lenguaje de programación C . Estas funciones se utilizan para probar la pertenencia de caracteres a una clase particular de caracteres, como caracteres alfabéticos, caracteres de control, etc. Se admiten caracteres anchos y de un solo byte. [1]
Historia
Los primeros programadores en lenguaje C que trabajaban en el sistema operativo Unix desarrollaron modismos de programación para clasificar caracteres en diferentes tipos. Por ejemplo, para el juego de caracteres ASCII , la siguiente expresión identifica una letra, cuando su valor es verdadero :
('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z')
Como esto puede expresarse en múltiples formulaciones, resultó deseable introducir formas cortas y estandarizadas de tales pruebas que se colocaron en el archivo de encabezado de todo el sistema ctype.h .
Implementación
A diferencia del ejemplo anterior, las rutinas de clasificación de caracteres no se escriben como pruebas de comparación. En la mayoría de las bibliotecas de C, se escriben como búsquedas de tablas estáticas en lugar de macros o funciones.
Por ejemplo, se crea una matriz de 256 enteros de ocho bits, organizados como campos de bits, donde cada bit corresponde a una propiedad particular del carácter, por ejemplo, isdigit, isalpha. Si el bit de orden más bajo de los enteros corresponde a la propiedad isdigit, el código podría escribirse como
#define isdigit (x) (TABLA [x] & 1)
Las primeras versiones de Linux usaban un método potencialmente defectuoso similar al primer ejemplo de código:
#define isdigit (x) ((x)> = '0' && (x) <= '9')
Esto puede causar problemas si la variable x tiene un efecto secundario . Por ejemplo, si uno llama a isdigit (x ++) o isdigit (run_some_program ()) . No es inmediatamente evidente que el argumento de isdigit se evalúe dos veces. Por esta razón, generalmente se utiliza el enfoque basado en tablas.
Resumen de funciones
Las funciones que operan sobre caracteres de un byte se definen en ctype.h archivo de cabecera ( cctype en C ++). Las funciones que operan sobre caracteres de ancho se definen en wctype.h archivo de cabecera ( cwctype en C ++).
La clasificación se evalúa de acuerdo con la configuración regional efectiva.
Carácter de byte | Carácter amplio | Descripción |
---|---|---|
isalnum | iswalnum | comprueba si el operando es alfanumérico |
isalpha | iswalpha | comprueba si el operando es alfabético |
islower | iswlower | comprueba si el operando está en minúsculas |
isupper | iswupper | comprueba si el operando está en mayúsculas |
isdigit | iswdigit | comprueba si el operando es un dígito |
isxdigit | iswxdigit | comprueba si el operando es hexadecimal |
iscntrl | iswcntrl | comprueba si el operando es un carácter de control |
isgraph | iswgraph | comprueba si el operando es un carácter gráfico |
isspace | iswspace | comprueba si el operando es un espacio |
isblank | iswblank | comprueba si el operando es un carácter de espacio en blanco |
isprint | iswprint | comprueba si el operando es un carácter imprimible |
ispunct | iswpunct | comprueba si el operando es puntuación |
tolower | towlower | convierte el operando a minúsculas |
toupper | towupper | convierte el operando a mayúsculas |
N / A | iswctype | comprueba si el operando pertenece a una clase específica |
N / A | towctrans | convierte el operando usando un mapeo específico |
N / A | wctype | devuelve una amplia clase de caracteres para ser utilizada con iswctype |
N / A | wctrans | devuelve un mapeo de transformación que se utilizará con towctrans |
Referencias
- ^ Especificación ISO / IEC 9899: 1999 (PDF) . pag. 193, párrafo 7.4.