Codificación aprenderaprogramar.com: CU00535F
FUNCIONES PARA CADENAS EN LENGUAJE C
C no dispone de un tipo de dato String para trabajar con cadenas de texto como en otros lenguajes. En su lugar, una cadena está representada por un array de caracteres (char) habitualmente terminado con el carácter especial de fin de cadena << \0 >>. Este carácter especial no se visualiza por pantalla, podríamos decir que está pero es "transparente" o "no visible" a través de la pantalla.
Comentamos previamente que las funciones para pedir datos al usuario scanf y gets introducen automáticamente un fin de cadena (\0) al final del texto capturado. En estos casos el array de caracteres tiene en C un carácter adicional además del texto visible, el correspondiente al final de cadena. Por ejemplo la longitud en caracteres de la palabra “abc” introducida por el usuario con scanf o gets no es tres, sino cuatro, ya que a los tres caracteres hemos de sumarle el carácter especial de final de cadena representado con \0.
CONOCER LA LONGITUD DE UNA CADENA CON SIZEOF
Podemos declarar cadenas de varias maneras. Por ejemplo:
char pruebaCadena [3]; pruebaCadena [0]= 'a'; pruebaCadena [1]= 'b'; pruebaCadena [2]= 'c';
char pruebaCadena [] = "abc";
En el primer caso el array es de tres caracteres, el de índice cero es a, el de índice 1 es b, el de índice 2 es c. En el segundo caso el array es de cuatro caracteres al introducir C el carácter de fin de cadena \0.
Llamamos tamaño (length) de un array al número de elementos de que consta. En el caso del array de caracteres “abc” con el carácter de fin de cadena decimos que consta de 4 elementos (contando el carácter especial de fin de cadena). Podemos conocer la longitud de un array de caracteres usando la función sizeof, siendo la sintaxis a emplear: sizeof (nombreDelArray).
Escribe este código, que ya debemos ser capaces de comprender con lo estudiado hasta ahora.
#include <stdio.h> #include <stdlib.h> int main() { int i = 0; int j=0; char pruebaCadena [] = "abc"; while (pruebaCadena[i] != '\0') { printf ("%c", pruebaCadena[i]); i=i+1; } printf ("%cUsando \\0: ", '\n'); while (pruebaCadena[j] != '\0') { printf ("Iteracion %d - ", j+1); j=j+1; } printf ("%cUsando sizeof: ", '\n'); j= 0; //Reinicializar j while (j < sizeof(pruebaCadena)) { printf ("Iteracion %d - ", j+1); j=j+1; } printf ("\nsizeof pruebaCadena es %d", sizeof(pruebaCadena)); return 0; // Ejemplo aprenderaprogramar.com } |
Aquí mostramos distintas formas de recorrer un array de caracteres. La primera se basa en buscar el carácter de fin de cadena \0. En este ejemplo el bucle while recorre a – b – c (tres iteraciones). La segunda se basa en usar sizeof. En este ejemplo el bucle while recorre a – b – c - \0 (cuatro iteraciones).
LIBRERÍA STRING.H FUNCIONES STRCPY, STRLEN, STRCAT, STRCMP
A través de la librería string.h podemos usar distintas funciones relacionadas con cadenas. Para usar estas funciones debemos escribir #include <string.h> en cabecera de nuestro programa. A continuación relacionamos algunas de las funciones disponibles.
Función |
Significado y ejemplo aprenderaprogramar.com |
strcpy (arg1, arg2) |
Copia arg2 en arg1. Ejemplo: strcpy (cadena, “control”); |
strlen (arg1) |
Devuelve la longitud del texto representado por arg1. Ejemplo: strlen(cadena1) |
strcat (arg1, arg2) |
Concatena las cadenas representadas por arg1 y arg2. Ejemplo: strcat(cadena1, “ unidades”) |
strcmp (arg1, arg2) |
Devuelve 0 si las cadenas representadas por arg1 y arg2 son iguales, o un valor menor que cero si arg1 precede alfabéticamente a arg2. Ejemplo: resComparacion = strcmp (cadena4, cadena2); |
Escribe el siguiente código y comprueba los resultados de ejecución.
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char cadena1 [] ="aprenderaprogramar.com"; char cadena2 [sizeof(cadena1)]; char cadena3[] = " ok!"; char cadena4[50]; int resComparacion; printf ("Cadena1 vale %s y Cadena2 vale %s \n", cadena1, cadena2); strcpy (cadena2, cadena1); //Copia cadena1 en cadena2 printf ("Cadena1 vale %s y Cadena2 vale %s \n", cadena1, cadena2); printf ("Cadena1 tiene longitud %d (uno mas contando \\0) \n", strlen(cadena1)); strcpy (cadena4, cadena1) ; printf ("Concatenacion %s \n", strcat(cadena4, cadena3)); resComparacion = strcmp (cadena4, cadena2); printf ("Cadena1 vale %s y Cadena2 vale %s \n", cadena1, cadena2); printf ("Cadena3 vale %s y Cadena4 vale %s \n", cadena3, cadena4); if (resComparacion ==0) { puts ("Las cadenas 1 y 2 son iguales"); } resComparacion = strcmp (cadena1, cadena3); if (resComparacion >0) { puts ("La cadena 1 precede alfabeticamente a la cadena 3"); } return 0; // Ejemplo aprenderaprogramar.com } |
Nota: las cadenas en C no se pueden copiar escribiendo cadena1 = cadena2. En su lugar, debe usarse la función strcpy.
EJERCICIO Nº 1
Escribe un programa que pida tres cadenas al usuario y muestre su longitud (número de letras).
Ejemplo: el usuario introduce como cadenas perro, pez y cocodrilo. El programa mostrará por pantalla. El número de letras para perro es 5. El número de letras para pez es 3. El número de letras para cocodrilo es 9.
Para comprobar si tus respuestas son correctas puedes consultar en los foros aprenderaprogramar.com.
EJERCICIO Nº 2
Escribe un programa que pida tres cadenas al usuario y muestre el resultado de concatenar las dos primeras letras de las cadenas introducidas y que indique si las dos primeras cadenas son iguales.
Ejemplo: el usuario introduce como cadenas perro, vaca y cocodrilo. El programa mostrará por pantalla: “El resultado de concatenar las dos primeras letras de las cadenas es: pevaco. La primera cadena, perro, no es igual a la segunda cadena, vaca.”
Si el usuario introdujera perro, perro, mulo, el programa debería mostrar: “El resultado de concatenar las dos primeras letras de las cadenas es pepemu. La primera cadena, perro, es igual a la segunda cadena, perro.”
Para comprobar si tus respuestas son correctas puedes consultar en los foros aprenderaprogramar.com.
Para hacer un comentario o consulta utiliza los foros aprenderaprogramar.com, abiertos a cualquier persona independientemente de su nivel de conocimiento.