Cadenas de caracteres
Introducción
Bienvenidas y bienvenidos nuevamente a una nueva clase digital del curso de Programación Básica. Esperamos que estés disfrutando todo este recorrido que hemos realizado sobre el aprendizaje en programación básica con lenguaje C.
En esta sesión estaremos trabajando con Cadenas de Caracteres.
Recordemos que un carácter es una letra, un número, un signo de puntuación o algún símbolo (generalmente identificados en la tabla de código ASCII).
Has estado trabajando en las sesiones pasadas en resolver problemas que usan valores de caracteres de tipo int, float, char, etc., para el uso de cadenas es necesario que recuerdes este tema de tipos de datos, así como, la comprensión de apuntadores, ya que estos dos temas te llevaran a digerir más fácilmente el funcionamiento de cadenas de caracteres.
Las cadenas de caracteres nos permiten almacenar datos de tipo texto, números, signos de puntuación o símbolos.
Ejemplo de uso de almacenamiento con cadenas de caracteres puede ser cuando queremos guardar un nombre completo (nombres y apellidos), direcciones, comentarios, etc.
A las cadenas de caracteres usualmente también se les llama vectores definidos de tipo char.
En esta clase aprenderás a crear arreglos de caracteres, usar apuntadores de caracteres, capturar cadenas e imprimirlas.
Estas a poco tiempo de finalizar este curso, por tanto, sigue dando todo de ti practicando e investigando para ampliar tu conocimiento, ¡Ánimo! Verás que las cadenas de caracteres es un tema sencillo y muy útil.
Sin más, ¡comencemos!
Desarrollo del tema
Como lo describimos en la introducción de la sesión un carácter es una letra, un número, un signo de puntuación o algún símbolo (generalmente identificados en la tabla de código ASCII). Las cadenas de caracteres nos permiten almacenar datos (secuencia de caracteres de tipo texto, números, signos de puntuación o símbolos). Ejemplo de uso de almacenamiento con cadenas de caracteres puede ser cuando queremos guardar un nombre completo (nombres y apellidos), direcciones, comentarios, etc.
Las cadenas en el lenguaje C son arreglos de caracteres (vectores unidimensionales), estas cadenas siempre terminan con el carácter especial cero “\0”.
Sintaxis para declaración de cadena:
char nombrecadena[n];
donde n es el número de elementos de tipo char, este arreglo almacenara la cadena.
char cadena [9];
Este arreglo almacenará 8 caracteres, el ultimo item será la secuencia de escape ‘\0’ (carácter nulo), por tanto, para reservar debemos usar la formula “n+1”. El carácter ‘\0’, pertenece a la cadena, pero no aparece al utilizar funciones como print.
Existen varias maneras de inicializar una cadena de caracteres (arreglo de caracteres):
char cadena[] = «Lenguaje»;
char cadena[] = {‘L’,’e’,’n’,’g’,’u’,’a’,’j’,’e’,0};
char cadena[] = {‘L’,’e’,’n’,’g’,’u’,’a’,’j’,’e’,’\0′};
Inicializando cadena especificando el tamaño del arreglo:
char cadena[9] = «Lenguaje»;
char cadena[9] = {‘L’,’e’,’n’,’g’,’u’,’a’,’j’,’e’,0};
char cadena[9] = {‘L’,’e’,’n’,’g’,’u’,’a’,’j’,’e’,’\0′};
Cuando se inicializa la cadena se reservan el número de bytes que son necesarios para la cadena, y debe inicializarse con el número de caracteres más uno, ya que para acceder a un elemento de la cadena de caracteres puede hacerse de la misma manera que a un acceso de un elemento de un array:
cadena[i]; donde: 0 <=i < n
Para trabajar con cadenas también podemos hacer uso de apuntadores. Se puede asignar un espacio para la cadena de compilación.
En el siguiente ejemplo se inicia una cadena, indicada por un apuntador a una variable del tipo char:
char *cadena;
Declaración de apuntador a una variable del tipo char llamado cadena, aquí no está apuntando a nada.
char *cadena = “Lenguaje de Programación en C”;
El apuntador cadena es inicializado para que apunte al primer carácter de la cadena. Una vez definida es un apuntador a la cadena. Y también puede declararse como:
char *cadena [ ] = “Lenguaje de Programación en C”;
Ambas declaraciones son “un apuntador a”
Ejemplo 1. Impresión de cadena
#include <stdio.h>
main()
{
char cadena [] = «Lenguaje de Programacion en C»;
printf( «Impresion de la cadena: %s\n», cadena );
printf( «Tamaño de la cadena: %i bytes\n», sizeof cadena ); //sizeof operador que nos indica la cantidad de almacenamiento en bytes
}
Salida Ejemplo 1
Funciones de entrada y salida de cadenas puts (), gets (), fscanf () y fprintf()
puts () imprime en pantalla una cadena. puts pone en pantalla cadenas literales y variables de cadena, cada vez que puts imprime una cadena o carácter, inserta una nueva línea después de la cadena que despliega.
gets () esta función lee y almacena una cadena de caracteres introducida. Almacena la variable hasta que encuentra en la entrada un salto de línea (“\n”), pero el salto de línea no es almacenado. gets agrega un carácter de terminación automáticamente null (“\0”). gets almacena todo tipo de caracteres, también almacena espacios en blanco y no tiene límite en el tamaño de cadena, para el uso de esta función gets y puts es recomendable declarar la librería string (#include <string.h>).
Las funciones printf y scanf imprimen y reciben datos respectivamente de distintos tipos de datos utilizando “%s” para la salida y para la entrada en ambas funciones. scanf () captura una cadena de texto y corta la introducción de este hasta que aparece el primer espacio o fin de línea, por tanto, se pierde todo texto que le siga.
Ejemplo 2. Uso de gets y puts (recuerda que gets corta la introducción de cadena hasta que encuentra un salto de línea)
#include <stdio.h>
#include <string.h>
int main(void)
{
char cadena[200];
printf(«Escribe una linea, podras probar el uso de la funcion gets(): \n»);
gets(cadena);
printf(«La linea que has introducido, se imprimira con la funcion puts(): \n»);
puts(cadena);
return 0;
}
Salida de Ejemplo 2.
Ejemplo 3. Leer con scanf
#include <stdio.h>
#define tam_cadena 50
int main(void)
{
char cadena[tam_cadena];
int num1, num2;
float num3;
printf(«Introduce dos numeros enteros separados por espacio: \n»);
scanf(«%d %d», &num1, &num2);
printf(«Introduce un numero decimal:\n»);
scanf(«%f», &num3);
printf(«Introduce una cadena:\n»);
scanf(«%s»,cadena); // recordemos que scanf al encontrar espacio en la introduccion rompe la cadena
printf(«Cadena leida:\n»);
printf(«%d %d %f %s\n»,num1,num2,num3,cadena);
return 0;
}Salida Ejemplo 3
Con la biblioteca <string.h> podemos seguir encontrando muchas funciones prácticas para trabajar con cadenas de caracteres:
Para ello no olvidemos incluir al inicio de nuestro .c:
#include <string.h>
Algunas de las funciones más usadas en esta biblioteca son:
- strlen( ): Devuelve la longitud de la cadena (número de caracteres de la cadena ), no toma en cuenta null “\0”
- strcpy( ) : Copia el contenido de una cadena a otra cadena. Se debe cuidar que ambas sean de la misma longitud.
- strcat( ) : Concatena el contenido de una cadena a otra. Se debe cuidar que la cadena destino tenga la longitud suficiente al concatenar.
- strcmp( ) : Compara las dos cadenas. Si son iguales, devuelve 0. Un número negativo si cadena1 es mayor que cadena2, y un número positivo si es al contrario.
- sprintf( ): Imprime como printf una salida, pero no muestra el resultado en pantalla sino que lo guarda en una variable.
Otra función importante es strtok()
Divide una cadena en segmentos o tókens. Esta división elimina la cadena segmento1 en el proceso. La forma de dividir la cadena depende de la secuencia de caracteres de la cadena segmento. A estos caracteres se les llama delimitadores. La función pasara la secuencia la cadena en busca de alguno de los delimitadores de la cadena segmento. Cuando encuentra el delimitador, el proceso se detiene, ya que tiene un token. Posterior a las llamadas del strtok se divide la cadena segmento en otros tokens.
Ejemplo 4. De delimitadores strtok()
#include <stdio.h>
int main()
{
char segmento1[50] = «Uso de la funcion strtok()»;
char segmento2[5] = » \n\t»;
char *puntero;
printf( «segmento1=%s\n», segmento1 );
puntero = strtok( segmento1, segmento2 ); // Primera llamada => Primer token
printf( «%s\n», puntero );
while( (puntero = strtok( NULL, segmento2 )) != NULL ) // Posteriores llamadas
printf( «%s\n», puntero );
return 0;
}
Salida Ejemplo 4.
Para que sigas practicando, te recomiendo visitar:
Donde tienes acceso a este libro: Ejercicios resueltos de programación en C.
Puedes acceder a este material con tu usuario y contraseña institucional dominio @ugto.mx.
Conclusión
En resumen, una cadena es una secuencia de caracteres, estos caracteres pueden ser letras,
números, signos de puntuación y símbolos (código ASCII). Una cadena de caracteres rompe la cadena con el carácter nulo (null ‘\0’).
El tipo de variable char nos permite almacenar caracteres, pero si lo que se desea es almacenar o reservar espacio para una cadena de caracteres debemos declarar char como un arreglo y como un puntero.
Las funciones de entrada y salida, gets, puts, scanf, printf nos apoyan con el manejo de cadenas de caracteres, scanf rompe la cadena en el primer espacio que encuentra y gets rompe la cadena con salto de línea.
Recordemos que la biblioteca #include <string.h> tiene diversas funciones que podemos incluir para la manipulación de cadenas.
Los códigos que fueron incluidos en esta sesión cópialos y ejecútalos en tu equipo de cómputo o compilador en línea, pueden apoyarte en trabajos futuros.
¡Sigue adelante vas muy bien!
Fuentes de información
- Gottfried, B. S. (2005). Programación en C. McGraw-Hill Interamericana. Schildt H (1991), Programación en TURBO C. McGraw-Hill.
- C Programming Language, Brian W. Kernighan Dennis M. Ritchie. Prentice Hall; 2 ed.