- 1 1. Introducción
- 2 2. El lenguaje C es sensible a mayúsculas y minúsculas
- 3 3. Determinación de mayúsculas vs minúsculas (carácter único)
- 4 4. Métodos para comparar cadenas sensibles e insensibles a mayúsculas y minúsculas
- 5 5. Conversión de caso (Conversión entre mayúsculas y minúsculas)
- 6 6. Errores comunes, trampas y casos de error
- 7 7. Columna mini sobre diferencias con otros lenguajes (Python, Java, etc.)
- 8 8. Tabla de resumen de comparaciones de mayúsculas y minúsculas
- 9 9. Resumen
- 10 10. FAQ (Preguntas frecuentes y respuestas)
- 11 11. Enlaces y referencias relacionados
1. Introducción
Al programar en C, a menudo te encuentras con problemas de sensibilidad a mayúsculas y minúsculas al manejar caracteres y cadenas. Por ejemplo, muchas personas han luchado con situaciones en las que las cosas no funcionan como se espera al verificar la entrada de usuario alfabética, comparar nombres de archivos o contraseñas, o manejar ramas condicionales.
De hecho, C está diseñado para distinguir estrictamente entre letras mayúsculas y minúsculas. No entender esto correctamente puede llevar a errores y equivocaciones de seguridad.
En este artículo explicaremos cuidadosamente la sensibilidad a mayúsculas y minúsculas en C desde lo básico. Cubrimos métodos de detección, el uso apropiado de funciones de comparación, código de muestra práctico, trampas comunes y diferencias con otros lenguajes, todo presentado de manera fácil de entender para principiantes. Al final de este artículo, tendrás una comprensión correcta de cómo manejar las mayúsculas y podrás desarrollar en C con mayor confianza.
2. El lenguaje C es sensible a mayúsculas y minúsculas
En C, las letras mayúsculas y minúsculas del alfabeto se tratan como caracteres completamente distintos. Esta regla se aplica a todos los caracteres alfabéticos en el programa, como nombres de variables, nombres de funciones y palabras clave.
Por ejemplo, main
y Main
se reconocen como identificadores distintos dentro del mismo programa. Value
y value
, así como sum
y SUM
, también se tratan como variables o funciones separadas, por lo que un error tipográfico descuidado puede causar un comportamiento no intencionado o errores de compilación.
Esta sensibilidad a mayúsculas y minúsculas proviene de la filosofía de diseño original de C. La codificación de caracteres utilizada por C (principalmente ASCII) asigna valores numéricos diferentes a las letras mayúsculas y minúsculas. Por ejemplo, A
es 65 y a
es 97, por lo que la misma letra tiene valores completamente diferentes dependiendo de si es mayúscula o minúscula.
Por lo tanto, en C, la diferencia de mayúsculas y minúsculas importa no solo para los nombres de variables y funciones, sino también al comparar los datos de caracteres en sí. Por ejemplo, al usar la función strcmp
para comparar cadenas, «Hello» y «hello» se consideran diferentes.
Por lo tanto, entender la naturaleza «sensible a mayúsculas y minúsculas» de C es esencial para garantizar un comportamiento correcto del programa y prevenir errores. En capítulos posteriores, discutiremos métodos concretos para pruebas y comparaciones sensibles a mayúsculas y minúsculas con más detalle.
3. Determinación de mayúsculas vs minúsculas (carácter único)
Si quieres determinar si un solo carácter es mayúscula o minúscula en C, hay varios métodos simples. Aquí introducimos dos métodos representativos comúnmente usados.
1. Verificación de rango usando códigos de carácter
Las letras mayúsculas (A–Z) y minúsculas (a–z) se definen como valores consecutivos en el código ASCII. Por lo tanto, puedes determinar mayúsculas o minúsculas con una condición como la siguiente.
if ('A' <= c && c <= 'Z') {
// c es mayúscula
}
if ('a' <= c && c <= 'z') {
// c es minúscula
}
Este método funciona cuando las letras se representan usando códigos ASCII. Está bien en la mayoría de los entornos de C, pero debes tener cuidado cuando se requieren conjuntos de caracteres no ASCII o soporte multilingüe.
2. Uso de funciones de la biblioteca estándar (ctype.h)
Un enfoque más conciso y legible es usar la biblioteca estándar de C ctype.h
. ctype.h
proporciona funciones convenientes para la clasificación de caracteres.
isupper(c)
… devuelve true (no cero) si c es un carácter alfabético en mayúsculaislower(c)
… devuelve true si c es un carácter alfabético en minúscula
#include
#include
int main(void) {
char c;
printf("Por favor ingresa un solo carácter alfabético: ");
scanf("%c", &c);
if (isupper(c)) {
printf("El carácter ingresado es mayúscula.
");
} else if (islower(c)) {
printf("El carácter ingresado es minúscula.
");
} else {
printf("El carácter ingresado no es una letra alfabética.
");
}
return 0;
}
isupper()
y islower()
pueden manejar caracteres no alfabéticos de manera adecuada, lo que los hace altamente prácticos.
De esta manera, en C puedes determinar fácilmente mayúsculas o minúsculas para cada carácter. Al elegir el método según tus necesidades y legibilidad, puedes prevenir clasificaciones erróneas y errores. En el próximo capítulo, discutiremos en detalle cómo comparar mayúsculas y minúsculas para múltiples caracteres (cadenas).
4. Métodos para comparar cadenas sensibles e insensibles a mayúsculas y minúsculas
Al comparar cadenas compuestas por múltiples caracteres en C, las funciones y métodos de implementación utilizados varían dependiendo de si se requiere sensibilidad a mayúsculas y minúsculas. Aquí, explicaremos en detalle los métodos de comparación típicos, sus diferencias y el uso práctico.
1. Comparación sensible a mayúsculas y minúsculas usando la función strcmp
La función de la biblioteca estándar de C strcmp
compara dos cadenas y determina si su contenido coincide exactamente. Esta función distingue estrictamente entre letras mayúsculas y minúsculas.
#include
#include
int main(void) {
char s1[100], s2[100];
printf("Por favor, ingrese la primera cadena: ");
scanf("%s", s1);
printf("Por favor, ingrese la segunda cadena: ");
scanf("%s", s2);
if (strcmp(s1, s2) == 0) {
printf("Las dos cadenas coinciden.
");
} else {
printf("Las dos cadenas no coinciden.
");
}
return 0;
}
En este ejemplo, «Hello» y «hello», así como «ABC» y «abc», se consideran cadenas diferentes.
2. Comparación insensible a mayúsculas y minúsculas (strcasecmp
o stricmp
)
Dependiendo de la plataforma, puede usar una función como strcasecmp
(o stricmp
en Windows) que compara cadenas ignorando las mayúsculas y minúsculas.
strcasecmp(s1, s2)
… comparar ignorando mayúsculas y minúsculas- En Windows, use
stricmp(s1, s2)
ostricmp(s1, s2)
Estas funciones no forman parte del estándar C, pero se proporcionan en muchos entornos. Cuando estén disponibles, se pueden usar de la siguiente manera.
#include
#include // Linux o macOS
// #include // En Windows, use stricmp o _stricmp
int main(void) {
char s1[100], s2[100];
printf("Por favor, ingrese la primera cadena: ");
scanf("%s", s1);
printf("Por favor, ingrese la segunda cadena: ");
scanf("%s", s2);
if (strcasecmp(s1, s2) == 0) {
printf("Las dos cadenas coinciden (ignorando mayúsculas y minúsculas).
");
} else {
printf("Las dos cadenas no coinciden.
");
}
return 0;
}
3. Comparar solo los primeros n caracteres con strncmp
o strncasecmp
Si desea realizar coincidencias parciales o comparar solo una longitud limitada, puede usar strncmp
(sensible a mayúsculas y minúsculas) o strncasecmp
(insensible a mayúsculas y minúsculas).
if (strncasecmp(s1, s2, 5) == 0) {
// Los primeros 5 caracteres coinciden
}
4. Puede implementar la suya propia cuando no esté disponible
Si strcasecmp
o stricmp
no están disponibles, puede implementar su propia conversión y comparación carácter por carácter usando tolower()
o toupper()
.
Por lo tanto, en C, si distingue o no las mayúsculas y minúsculas cambia drásticamente las funciones y métodos de comparación que utiliza. Elija la función adecuada para su propósito para evitar errores y comportamientos no deseados. En el próximo capítulo, discutiremos métodos para convertir el caso.
5. Conversión de caso (Conversión entre mayúsculas y minúsculas)
En C, hay muchas situaciones en las que necesitas convertir caracteres entre mayúsculas y minúsculas. Por ejemplo, es posible que desees normalizar la entrada del usuario a todas minúsculas para comparaciones, o capitalizar la salida para mejorar la legibilidad. Esta sección introduce los métodos típicos.
1. Funciones de la biblioteca estándar toupper()
y tolower()
El encabezado de la biblioteca estándar de C ctype.h
proporciona funciones para convertir un solo carácter a mayúscula o minúscula.
toupper(c)
— Devuelve la versión en mayúscula si c es minúscula; de lo contrario, devuelve c sin cambiostolower(c)
— Devuelve la versión en minúscula si c es mayúscula; de lo contrario, devuelve c sin cambios
Ejemplo: Convertir minúsculas a mayúsculas o mayúsculas a minúsculas
#include
#include
int main(void) {
char c;
printf("Ingrese un solo carácter alfabético: ");
scanf(" %c", &c);
printf("Mayúscula: %c\n", toupper(c));
printf("Minúscula: %c\n", tolower(c));
return 0;
}
Como puedes ver, convertir un carácter a la vez es muy directo.
2. Convertir una cadena completa
Si deseas convertir una cadena de múltiples caracteres completa, puedes iterar sobre cada carácter y usar toupper()
o tolower()
.
Ejemplo: Convertir una cadena a todas minúsculas
#include
#include
#include
int main(void) {
char str[100];
printf("Ingrese una cadena: ");
scanf("%s", str);
for (int i = 0; i < strlen(str); i++) {
str[i] = tolower(str[i]);
}
printf("Resultado de conversión a minúsculas: %s\n", str);
return 0;
}
El mismo enfoque funciona para convertir a mayúsculas.
3. Conversión usando operaciones aritméticas
Se basa en los códigos ASCII, donde las letras mayúsculas y minúsculas difieren por un desplazamiento constante (32). Por lo tanto, las siguientes conversiones son posibles.
// Minúsculas a mayúsculas
if ('a' <= c && c <= 'z') {
c = c - ('a' - 'A');
}
// Mayúsculas a minúsculas
if ('A' <= c && c <= 'Z') {
c = c + ('a' - 'A');
}
Sin embargo, considerando preocupaciones de legibilidad y portabilidad, se recomienda generalmente usar toupper()
y tolower()
.
Como se muestra, convertir entre mayúsculas y minúsculas en C es directo. Esta técnica es especialmente útil al manejar entrada de usuario, nombres de archivos o verificación de contraseñas donde el caso debe ignorarse. El próximo capítulo discutirá errores comunes y consideraciones al realizar tales conversiones y comparaciones.
6. Errores comunes, trampas y casos de error
Al manejar la sensibilidad al caso, comparación y conversión en C, una pequeña omisión o malentendido puede llevar a errores y problemas. Aquí resumimos errores comunes, trampas y ejemplos reales de errores.
1. Uso incorrecto de strcmp
La función strcmp
compara con sensibilidad al caso. Por lo tanto, «Hola» y «hola» se consideran no coincidentes.
Si quieres comparar ignorando el caso de manera no intencional y usas strcmp
, no se comportará como se espera y puede causar confusión.
Ejemplo: No coincidencia inesperada
if (strcmp("Hola", "hola") == 0) {
// la condición no se cumple
}
En este caso, el valor de retorno de strcmp
no es cero, por lo que se juzga como «no coincidente».

2. Olvidar la conversión de caso
Al comparar entrada de usuario o datos externos, a menudo se olvida normalizar el caso antes de la comparación. Por ejemplo, sin conversión durante la autenticación de contraseña o comparación de nombres de archivo, los usuarios pueden no poder usar el sistema como se espera.
Ejemplo: No convertir a minúsculas antes de la comparación
if (strcmp(user_input, "contraseña") == 0) {
// Si el valor de entrada es "Contraseña" o "CONTRASEÑA", no coincidirá
}
→ Convertir a minúsculas con tolower()
antes de la comparación previene el error.
3. Disponibilidad de strcasecmp
y stricmp
y dependencia de la plataforma
strcasecmp
y stricmp
no forman parte del lenguaje C estándar.
Su uso está limitado por el entorno.
- Sistemas Linux/UNIX …
strcasecmp
- Windows …
stricmp
ostricmp
- Los entornos más antiguos pueden no soportar ninguno
En tales casos, necesitas implementar tu propia lógica de comparación usando tolower()
o toupper()
.
4. Ejemplos de errores en tiempo de compilación y en tiempo de ejecución
- Faltan inclusiones de archivos de cabecera (
ctype.h
,string.h
) - Error tipográfico en el nombre de la función (p. ej.,
toloower
,toLower
etc.) - Desbordamiento de búfer debido a tamaño de arreglo insuficiente
Ejemplo: Error de compilación debido a cabecera faltante
printf("%c", tolower('A'));
→ Falta #include <ctype.h>
5. Ejemplo de error: Fallo de autenticación debido a no coincidencia de caso
Caso: La contraseña falla durante la autenticación de inicio de sesión
- El sistema trata «Contraseña» y «contraseña» como diferentes
- Los usuarios a menudo no se preocupan por el caso
- En consecuencia, incluso con la contraseña correcta, la autenticación falla
Contramedidas:
- Normalizar toda la entrada a minúsculas
- Especificar claramente en la especificación si el caso importa e informar a los usuarios
Por lo tanto, los errores típicos y equivocaciones relacionados con el manejo de caso se pueden prevenir con una comprensión básica y un poco de cuidado. En el próximo capítulo, explicaremos las diferencias entre C y otros lenguajes de programación principales en formato de mini-columna.
7. Columna mini sobre diferencias con otros lenguajes (Python, Java, etc.)
Al programar en C, podrías preguntarte: “¿Cómo manejan la sensibilidad a mayúsculas y minúsculas otros lenguajes?” Aquí introducimos brevemente las diferencias entre C y otros lenguajes comúnmente usados como Python y Java.
1. Distinción de identificadores (nombres de variables, nombres de funciones)
Al igual que C, la mayoría de los lenguajes modernos distinguen mayúsculas y minúsculas en los identificadores.
- CEjemplo:
value
yValue
son diferentes - JavaSe distinguen completamente. Es estricto con las mayúsculas y minúsculas en los nombres de clases y métodos también.
- PythonTambién sensible a mayúsculas y minúsculas. Las convenciones de nomenclatura de Python están claramente definidas en PEP 8, por lo que se recomienda un uso consistente de mayúsculas y minúsculas.
- JavaScript / C++ / Go, etc.Todos son sensibles a mayúsculas y minúsculas.
2. Diferencias en la comparación de cadenas
- CLa comparación de cadenas usa funciones como
strcmp
, yla distinción de mayúsculas y minúsculas es la predeterminada. - PythonPuedes comparar con el operador
==
, y es sensible a mayúsculas y minúsculas. Para realizar una comparación insensible a mayúsculas y minúsculas, convierte usandolower()
ocasefold()
antes de comparar.
if s1.lower() == s2.lower():
# comparación insensible a mayúsculas y minúsculas
- JavaEl método
equals()
es sensible a mayúsculas y minúsculas, mientras queequalsIgnoreCase()
proporciona una comparación insensible a mayúsculas y minúsculas. - JavaScriptEl operador
===
es sensible a mayúsculas y minúsculas. Para comparación insensible a mayúsculas y minúsculas, usatoLowerCase()
y métodos similares para normalizar antes de comparar.
3. Precauciones centradas en el usuario
Si estás acostumbrado a otros lenguajes, podrías asumir que “las comparaciones de cadenas ignoran automáticamente las mayúsculas y minúsculas”. Sin embargo, la mayoría de los lenguajes requieren una distinción explícita de mayúsculas y minúsculas, por lo que este punto requiere atención no solo en C sino también en otros lenguajes.
4. Diferencias en convenciones y prácticas de codificación
Por ejemplo, en Java se recomienda que los nombres de clases comiencen con una letra mayúscula (PascalCase) y los nombres de variables con una minúscula (camelCase), por lo que las convenciones de nomenclatura incorporan el significado de las mayúsculas y minúsculas. En C, las convenciones son libres, pero se aconseja establecer reglas de nomenclatura consistentes para mejorar la legibilidad y evitar confusiones.
Por lo tanto, la sensibilidad a mayúsculas y minúsculas es un punto importante en muchos lenguajes de programación, no solo en C. Dado que los métodos de comparación y las reglas de nomenclatura varían ligeramente entre lenguajes, ten especial cuidado con ellos al reaprender o cambiar a otros lenguajes.
8. Tabla de resumen de comparaciones de mayúsculas y minúsculas
Aquí presentamos una tabla de referencia rápida que resume de manera ordenada las funciones y métodos representativos del lenguaje C para determinar, comparar y convertir caracteres en mayúsculas y minúsculas, organizados por caso de uso. Cuando no estés seguro durante la codificación real, consulta esta lista.
Tabla de referencia rápida por caso de uso – Funciones/Métodos principales
Uso | Sensible/Insensible al caso | Funciones/Métodos principales | Características/Notas |
---|---|---|---|
Determinar si un carácter único es mayúscula o minúscula | Sin distinción (verificación) | isupper(c) , islower(c) | ctype.h -definidas, verifica solo caracteres alfabéticos |
Convertir un carácter único a mayúscula/minúscula | – | toupper(c) , tolower(c) | ctype.h , los caracteres no alfabéticos permanecen sin cambios |
Verificar si un carácter es alfabético | – | isalpha(c) | ctype.h , solo A-Z/a-z |
Comparar cadenas con sensibilidad al caso | Sensible al caso | strcmp(s1, s2) | Biblioteca estándar, comparación estricta usando códigos ASCII |
Comparar cadenas sin sensibilidad al caso | Insensible al caso | strcasecmp(s1, s2) | Función no estándar, dependiente de la plataforma. Disponible en sistemas Linux/UNIX |
Comparar los primeros n caracteres de cadenas con sensibilidad al caso | Sensible al caso | strncmp(s1, s2, n) | Compara solo los primeros n caracteres |
Comparar los primeros n caracteres de cadenas sin sensibilidad al caso | Insensible al caso | strncasecmp(s1, s2, n) | No estándar, Linux/UNIX |
Comparación insensible al caso dependiente de la plataforma (Windows) | Insensible al caso | stricmp(s1, s2) , _stricmp(s1, s2) | Windows/MSVC. Implementa la tuya propia si no está disponible |
Comparación personalizada (insensible al caso) | Insensible al caso | Bucle + tolower() /toupper() | Convertir todos los caracteres antes de comparar |
Puntos clave para ejemplos de uso
- Al comparar cadenas, elige funciones según la sensibilidad al caso
- Verifica que las funciones no estándar como
strcasecmp
estén disponibles en tu entorno de desarrollo - Para portabilidad y mantenibilidad, convertir con
tolower()
otoupper()
seguido destrcmp
es confiable
Al usar esta tabla, puedes resolver rápidamente preguntas durante la codificación como “¿Qué función debo usar?” o “¿Cómo se manejará el caso?”
9. Resumen
Hasta este punto, hemos explicado de manera exhaustiva la sensibilidad a mayúsculas y minúsculas en C, cubriendo métodos de detección, consejos de comparación, código de muestra concreto, errores comunes y precauciones, y diferencias con otros lenguajes.
En C, las letras mayúsculas y minúsculas se tratan como caracteres completamente distintos. Esta especificación afecta no solo a los nombres de variables y funciones, sino también a las cadenas y comparaciones e inspecciones carácter por carácter. Procesar sin tener en cuenta las mayúsculas y minúsculas puede llevar a errores y bugs inesperados, por lo que es importante tener el conocimiento correcto.
Al usar las funciones introducidas en el artículo—isupper()
y islower()
para verificaciones de un solo carácter, toupper()
y tolower()
para conversión, y strcmp()
y strcasecmp()
para comparaciones—puedes escribir programas flexibles adaptados a la situación.
Especialmente para comparaciones de cadenas, elegir una implementación que coincida con tu intención—’sensible a mayúsculas y minúsculas’ o ‘insensible a mayúsculas y minúsculas’—es clave. Además, estar al tanto de errores comunes y patrones de error ayuda a prevenir problemas en entornos de desarrollo reales.
Patrones de Implementación Comunes (Ejemplos Recomendados)
- Normalizar las mayúsculas y minúsculas de los valores de entrada antes de comparar
- Verificar si las funciones dependientes del entorno están disponibles, y considerar implementaciones personalizadas si no lo están
- Tener en cuenta las reglas de mayúsculas y minúsculas al nombrar y codificar
La sensibilidad a mayúsculas y minúsculas en C es un fundamental que tanto principiantes como profesionales deben dominar. Adquiere el conocimiento correcto y aplícalo para desarrollar programas más robustos y resistentes a errores.
10. FAQ (Preguntas frecuentes y respuestas)
Aquí hemos compilado las preguntas más frecuentes y sus respuestas sobre la sensibilidad al caso y la comparación en el lenguaje C. Vamos a aclarar cualquier duda pequeña en esta sección.
P1. ¿Cuál es la diferencia entre strcmp
y strcasecmp
?
A. strcmp
compara dos cadenas distinguendo estrictamente entre caracteres en mayúscula y minúscula. En contraste, strcasecmp
(o stricmp
de Windows) es una función conveniente que puede comparar sin distinguir el caso. Sin embargo, strcasecmp
y stricmp
no son funciones estándar de C, y su disponibilidad varía según el entorno.
P2. ¿Qué debo hacer si strcasecmp
o stricmp
no está disponible?
A. En ese caso, una implementación personalizada que recorra las cadenas, convirtiendo cada carácter con tolower()
o toupper()
antes de comparar, es efectiva. El enfoque común es normalizar todo a minúsculas (o mayúsculas) y luego comparar con strcmp
.
P3. ¿Cómo puedo determinar fácilmente si un carácter es mayúscula o minúscula?
A. Usar las funciones de la biblioteca estándar ctype.h
isupper()
(prueba de mayúscula) y islower()
(prueba de minúscula) es simple y recomendado.
if (isupper(c)) { /* mayúscula */ }
if (islower(c)) { /* minúscula */ }
P4. ¿Los identificadores (nombres de variables y funciones) también son sensibles al caso?
A. Sí, en C, los identificadores también son sensibles al caso. Por ejemplo, sum
y SUM
se reconocen como variables completamente diferentes. Ten cuidado con errores tipográficos y de nomenclatura.
P5. ¿Se pueden probar o convertir caracteres japoneses o multibyte con isupper
o tolower
?
A. No, generalmente isupper
y tolower
solo funcionan con letras ASCII (A–Z, a–z). No soportan caracteres japoneses u otros multibyte. Si se necesita soporte para multilingüe o internacionalización, use bibliotecas dedicadas o funciones conscientes de Unicode.
P6. No quiero preocuparme por el caso cada vez que comparo. ¿Qué debo hacer?
A. Convierte las cadenas a todas minúsculas (o mayúsculas) antes de comparar, para que no tengas que pensar en el caso cada vez. Alternativamente, si tu entorno soporta funciones de comparación insensible al caso como strcasecmp
, úsalas bien.
P7. ¿Qué pasa con letras de ancho completo o caracteres especiales al comparar con strcmp
o strcasecmp
?
A. Estas funciones están diseñadas pensando en caracteres ASCII, por lo que pueden no manejar correctamente letras de ancho completo, símbolos o caracteres especiales. Cuando se mezclan japonés o letras de ancho completo, considera usar una biblioteca de cadenas multibyte (p. ej., mbstowcs
o wcsicmp
) en su lugar.
Consulta esta FAQ para encontrar rápidamente respuestas cuando encuentres confusión o preguntas durante la implementación.
11. Enlaces y referencias relacionados
En este capítulo, compilamos enlaces recomendados e información de referencia para aquellos que deseen profundizar su comprensión de la detección, comparación y conversión de mayúsculas y minúsculas en C, o que busquen información práctica y útil. Por favor, haga uso de estos recursos durante el aprendizaje e implementación.
Referencias externas útiles y documentación oficial
- Tabla de códigos ASCII (sitio externo)
Una lista práctica que muestra los valores de código de las letras y símbolos de un vistazo. - Página man de Linux – strcasecmp(3)
Referencia detallada para comparaciones insensibles a mayúsculas y minúsculas cuando sea necesario.
Conclusión
Al utilizar no solo el contenido de este artículo sino también la información de referencia, puede volverse aún más competente en el manejo de mayúsculas y minúsculas en C. Ayuda a consolidar nuevos conocimientos, prevenir errores antes de que ocurran y comparar con otros lenguajes de programación, por lo que siéntase libre de consultar los recursos enlazados según sea necesario.