En este artículo, aprenderá cómo declarar cadenas de caracteres en C. Antes de hacerlo, se realizará una visión general básica de qué son los tipos de datos, las variables y los arreglos en C. De esta manera, entenderá cómo todos estos están conectados entre sí cuando se trata de trabajar con cadenas en C.
Cuando se estudió los tipos de datos definidos en C, se pudo observar que el lenguaje C sólo define datos de tipo entero y de punto flotante. El tipo de dato
Es el compilador el que interpreta estos caracteres y los almacena en la memoria como representaciones binarias. Es por esta razón que una expresión puede darse de esta manera a = 'A' + 32;, no es que se pretenda sumar el valor de 32 a la letra A, sino que se está sumando 32 al valor numérico que este carácter representa. Cada carácter ocupa un byte en memoria.
¿Qué es una cadena de caracteres en C?
En este sentido podemos definir una cadena de caracteres en C como un arreglo en el que cada elemento es de tipo
Para saber dónde terminan los caracteres válidos en el arreglo, se debe colocar un valor de terminación al final de la secuencia de caracteres. Este valor es cero, que representa al carácter cuyo código ASCII es cero. En C, todas las cadenas terminan en un 0. Ese cero que termina la cadena se llama carácter fin de cadena o carácter nulo. El carácter fin de cadena se representa como '\0'. La longitud de una cadena en C es solo el número de caracteres en una palabra, sin incluir el terminador de cadena.
Lea también: IVA 21% Excel
Esta forma de manipular las cadenas de caracteres trae muchas ventajas en comparación de la forma en que lo hacen otros lenguajes de programación. Por ejemplo en Pascal, la longitud de las cadenas de caracteres se almacena en la misma representación, al inicio de la secuencia de caracteres, con la limitación de no poder tener más de 255 caracteres.
Declaración e Inicialización de Cadenas de Caracteres
El primer paso para declarar una cadena es usar el tipo de dato
char nombre[20]; donde "nombre" es una cadena de caracteres que puede albergar hasta 19 caracteres, no olvidar que se requiere un espacio para el delimitador de la cadena (cero o '\0').
Como cualquier arreglo, una cadena de caracteres puede ser inicializada en el momento de su declaración. Si se colocan menos valores de inicialización que la capacidad del arreglo, el resto de elementos del arreglo se inicializa en cero. Los valores constantes dados para una cadena de caracteres se representan como una secuencia de caracteres encerrados entre comillas, por ejemplo: "Cadena", "Juan Perez Castro". Luego el compilador reemplaza el valor constante por la dirección de inicio del área asignada. El terminador de cadena se agrega automáticamente al final de cada cadena en C.
A continuación, algunos ejemplos de inicialización:
Lea también: Guía IVA reducido
- char nomb2[10] = {'H', 'o', 'l', 'a', '\0', '+', '\t', '{', '\n', 'A'};
- char nomb4[10] = "Hola";
Lectura y Escritura de Cadenas de Caracteres
El lenguaje C/C++ implementa una serie de funciones que permiten el ingreso y la salida de cadenas de caracteres a, y desde, un programa.
Uso de printf y scanf
La función printf permite, empleando el especificador de formato %s, la impresión del contenido de un arreglo de tipo
La función scanf permite el ingreso de datos desde la consola. Esta misma función, empleando el especificador de formato %s, permite el ingreso de cadenas de caracteres. La función scanf irá tomando uno a uno los caracteres del buffer de entrada, y los irá colocando consecutivamente en el arreglo a partir del primer elemento. Cuando llamamos a scanf es necesario pasar un puntero a la variable donde queremos que se almacene el dato. Para ello es necesario poner delante del nombre de la variable un &. La función scanf también se puede emplear con punteros, sin embargo, se debe tener especial cuidado en el sentido de asegurar antes que el puntero apunte a una dirección válida.
Se denomina "conjunto de exploración" a una lista de caracteres que se coloca en la cadena de formato de la función scanf y permite restringir los caracteres que se pueden ingresar a una cadena de caracteres. También se puede negar un conjunto, de modo que se permita cualquier carácter menos los contenidos en el conjunto. Esto se logra poniendo el carácter ^ al inicio del conjunto.
Uso de gets y puts
Otro par de funciones que permiten el ingreso y la salida de cadenas de caracteres son las funciones gets y puts. La función gets recibe como parámetro un arreglo de tipo
Lea también: ¿Cómo localizar tus XML del SAT?
Uso de cin y cout (C++)
Finalmente se pueden emplear los objetos cin y cout. También existe un método asociado a cin que permite realizar una operación similar a gets, este método se denomina getline. Donde "cad" es una cadena de caracteres y n es la cantidad máxima de caracteres menos uno, que se podrá leer desde el buffer de entrada.
Asignación y Comparación de Cadenas de Caracteres
Asignación de Cadenas
En el caso de las cadenas de caracteres, no se puede asignar valores como se hacen con las variables numéricas. La razón de esto es la forma como se definen las cadenas en C, mediante arreglos. Esto debido a que, cuando en un programa se emplea el identificador del arreglo sin colocar un índice entre corchetes, se estará haciendo referencia a la dirección de memoria del inicio del área de datos del arreglo.
La pregunta ahora es ¿cómo hacer la asignación? La respuesta a esto es sencilla aunque no es tan inmediata como una asignación simple, habrá que elaborar una rutina que permita asignar carácter a carácter los elementos de un arreglo al otro. Para asignar caracter a caracter, los punteros destino y origen apuntan inicialmente al primer elemento del arreglo respectivo. Luego se aplica el operador ++, que está como sufijo, a destino y a origen, por lo que cada puntero termina apuntando al siguiente carácter de la cadena. Cuando se encuentra el carácter de terminación, que es un valor cero, el ciclo se detiene. Esto último quiere decir que no se necesita dar una orden adicional para asignar el carácter de terminación a la cadena destino.
Comparación de Cadenas
Para comparar dos cadenas de caracteres, debemos elaborar una rutina que sea capaz de comparar carácter a carácter dos cadenas y así poder determinar, si son iguales, si una es mayor que otra o viceversa. El compilador no detectará errores si se intenta comparar directamente, sin embargo al ejecutarlo se imprimirá siempre el mensaje Diferentes, sin importar qué valores asignemos a las cadenas. En una rutina de comparación, si los valores referenciados son iguales, se verifica si este valor es cero (0 ó '\0'), si es así se da por terminada la función y se retorna cero.
Funciones de la Biblioteca string.h
Todos los compiladores de C implementan una biblioteca de funciones que permite, de una manera sencilla, la manipulación de cadenas de caracteres. Estas funciones trabajan con las cadenas de la misma manera que lo hemos hecho en este capítulo, es decir, manipulando carácter por carácter cada uno de los elementos del arreglo. Para usar estas funciones, se debe incluir la línea #include <string.h>.
| Función | Descripción |
|---|---|
| strlen(cad) | Devuelve el número de caracteres de la cadena "cad". No cuenta el carácter de terminación. |
| strcpy(destino, origen) | Copia todos los caracteres de la cadena origen en la cadena destino, incluso el carácter de terminación. Devuelve un puntero a destino. |
| strcmp(cad1, cad2) | Compara uno a uno los caracteres de ambas cadenas hasta completarlos todos o hasta encontrar una diferencia. Devuelve cero (0) si ambas cadenas son iguales, un valor negativo si la primera cadena es menor que la segunda y un valor positivo si la primera es mayor que la segunda. |
| strcat(destino, origen) | Agrega una copia de la cadena origen al final de la cadena destino. Devuelve la dirección a la que apunta la variable destino. |
| strstr(cad1, cad2) | Busca la primera ocurrencia de la cadena "cad2" en la cadena "cad1". Si la encuentra, devuelve un puntero que apunta al primer carácter de la ocurrencia en "cad1", si no lo encuentra devuelve NULL. |
| strchr(cad, c) | Busca la primera ocurrencia del carácter contenido en la variable "c". Si lo encuentra, devuelve un puntero que apunta al carácter encontrado en "cad", si no lo encuentra devuelve NULL. |
| strrchr(cad, c) | Busca la última ocurrencia del carácter contenido en la variable "c". Si lo encuentra, devuelve un puntero que apunta al carácter encontrado en "cad", si no lo encuentra devuelve NULL. |
| strpbrk(cad1, cad2) | Busca la primera ocurrencia de cualquier carácter de la cadena "cad2" en la cadena "cad1". Si la encuentra, devuelve un puntero que apunta al carácter encontrado en la cadena "cad1", si no lo encuentra devuelve NULL. |
| strupr(cad) (no estándar) | Convierte las letras contenidas en la cadena "cad" en mayúsculas. Devuelve un puntero a la cadena "cad". |
| strlwr(cad) (no estándar) | Convierte las letras contenidas en la cadena "cad" en minúsculas. Devuelve un puntero a la cadena "cad". |
| strrev(cad) (no estándar) | Invierte los caracteres contenidos en la cadena "cad". Devuelve un puntero a la cadena "cad". |
Manejo de Caracteres Especiales y Codificación
Secuencias de Escape
Hay algunas circunstancias especiales, como el querer mostrar unas comillas en un texto, que han de resolverse de una forma especial. Por ejemplo, introducir unas comillas como printf("El presidente dijo "hola""); daría lugar al cierre del texto y a un error sintáctico. Esta cuestión, así como la representación de singularidades como el tabulador o un salto de línea se solucionan utilizando lo que se denomina secuencias de escape.
Las secuencias de escape sirven para representar caracteres especiales como el salto de línea (\n) o la tabulación (\t).
- \n: Salto de línea.
- \t: Tabulación.
- \\: Barra invertida.
- \": Comillas dobles.
- \': Comilla simple.
Problemas con Ñ y Tildes (Localización)
Ya habrá comprobado que con printf la letra 'ñ' no es mostrada por pantalla y las tildes tampoco. Esto es debido a motivos históricos y a los orígenes anglosajones del lenguaje. C usa el juego de caracteres ASCII por el que cada letra tiene asociado un número. Por ejemplo, la letra A mayúscula tiene asociado el número 65, la B el 66…, y la a minúscula tiene asociado el número 97, la letra b el 98… .
Es posible indicar al programa que tenga en cuenta la configuración regional del sistema operativo con una función llamada setlocale que está disponible en la librería locale.h. Gracias a esta función, ahora se interpretan correctamente los acentos y las letras 'ñ' que aparecen dentro de los literales de tipo cadena de carácter (textos entre comillas) que aparecen en nuestro código.
