Tema 7 Estructuras de datos: las cadenas de caracteres (strings) Cadenas de caracteres Son estructuras idénticas a los tablas numéricas, con la diferencia de que almacenan caracteres Todo lo visto para los arrays sirve para los strings No obstante, los strings presentan peculiaridades que veremos a continuación (y que no son aplicables a las tablas numéricas) 2 Strings Al representarlos se delimitan por comillas (“ ”). “hola mundo” Contienen un carácter adicional (‘\0’) al final de la cadena para señalar el final de la misma No necesariamente corresponde con el final físico (es decir, la última posición definida para el string) 0 1 2 3 4 5 6 7 8 9 10 ‘h’ ‘o’ ‘l’ ‘a’ ‘ ’ ‘m’ ‘u’ ‘n’ ‘d’ ‘o’ ‘\0’ 11 12 ... ? ? ... 3 Definición de strings char nombre_cadena[numero_caracteres + 1]; Ejemplo #define N 51 int main( void) { char cadena[N]; .... } 4 Carga de elementos En el caso de los arrays se hace con un bucle Con los strings se puede hacer igual do { printf(“\nDame un caracter: ”); fflush(stdin); scanf(“%c”, &cadena[i]); i = i+1; printf (“\nMas caracteres? (s/n)”); fflush(stdin); scanf(“%c”, &resp); } while (resp ==‘s’ && i < N-1); cadena[i] = ‘\0’; 5 Carga de elementos Lo mejor es hacerlo con una sola instrucción scanf(“%s”, cadena); /* sin & */ Captura los caracteres hasta espacio, tabulador o intro gets(cadena); Captura los caracteres tecleados hasta intro En ambos casos se añade automáticamente el ‘\0’ 6 #include <string.h> Será necesario añadir esta línea cuando vayamos a trabajar con strings En concreto, para usar las funciones gets y strlen 7 Escritura de elementos También se puede hacer de dos formas Carácter a carácter en bucle: printf(“%c”,cadena[i]); Todo de una vez: printf(“%s”, cadena); En este caso se escribe hasta el carácter ‘\0’ (no incluido) 8 Ejemplo Programa que lee una cadena y la rescribe #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 51 int main(void) { char cadena[N]; printf("Escribe algo:"); fflush(stdin); gets(cadena); printf("\nLo que has escrito es: %s", cadena); printf("\n\n"); system("pause"); } 9 Ejercicio para hacer ahora Función que recibe como parámetro una cadena de caracteres y devuelve el número de caracteres “válidos” que contiene Es decir, cuántos caracteres hay antes del ‘\0’ En este ejemplo: 10 0 1 2 3 4 5 6 7 8 9 10 ‘h’ ‘o’ ‘l’ ‘a’ ‘ ’ ‘m’ ‘u’ ‘n’ ‘d’ ‘o’ ‘\0’ 11 12 ... ? ? ... 10 La función strlen Esta función recibe un string y devuelve la posición en la que se encuentra el carácter ‘\0’ O lo que es lo mismo, el número de caracteres “válidos” de la cadena 11 Ejemplo Programa que lee un string y lo rescribe al revés #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 10 int main(void) { char cadena[N]; int longi, i; printf(“Escribe algo...”); fflush(stdin); gets(cadena); longi = strlen(cadena); printf(“Tu cadena al reves es: ”); for (i= longi-1; i>=0; i= i-1) { printf(“%c”, cadena[i]); } system(“pause”); } 12 Otras funciones interesantes void strcpy (char destino[], char origen[]) Copia la cadena origen en la cadena destino. void strcat (char cadena1[], char cadena2[]) Concatena cadena1 y cadena2 y deja el resultado en cadena1. int strcmp(char cadena1[], char cadena2[]) Devuelve 0 si ambas cadenas son iguales y algo distinto de 0 en caso contrario 13 El dato de tipo carácter En el ordenador cada carácter se representa con un número Por tanto podemos aplicar operaciones numéricas a los caracteres: Dado un carácter (char car) Es una letra mayúscula si: car>=‘A’ && car<=‘Z’ Es una letra minúscula si car>=‘a’ && car<=‘z’ La letra siguiente a car sería car+1 o ‘B’+1→ ‘C’ 14 El dato de tipo carácter Para pasar un carácter de mayúscula a minúscula hay dos opciones: Para pasar un carácter de minúscula a mayúscula car_minuscula = car_mayuscula + 32; Usar la función tolower: car_minuscula = tolower(car_mayuscula) car_mayuscula = car_minuscula – 32; Usar la función toupper: car_mayuscula = toupper(car_minuscula) ¡Ojo! Las funciones toupper y tolower se aplican a caracteres sueltos, no a strings completos Para poder usar toupper/tolower: #include <ctype.h> 15 16 Ejercicios propuestos (I) 1.- Leer una cadena de no más de 100 caracteres y contar el número de apariciones de la sílaba “la” 2.- Leer una cadena compuesta sólo por letras y blancos y mostrar las iniciales de cada palabra Al principio, al final, y entre palabras puede haber más de un blanco 17 Ejercicios propuestos (II) 3.- Leer dos cadenas de 50 caracteres y decidir si son iguales (1) o no (0) 4.- Leer dos cadenas de no más de 40 caracteres cada una y obtener otra (de tamaño máximo 79) con la concatenación de ambas 5.- Leer una cadena y luego dos caracteres (car1 y car2). Sustituir las apariciones de car1 por car2 18 Ejercicios propuestos (III) 6.- Función que recibe un string s y un carácter c, y elimina las apariciones de c en s (desplazando a la izquierda) 7.- Función que decide si un string contiene todas las vocales 8.- Función que codifica un string de modo que cada vocal se sustituye por la siguiente letra del abecedario, y cada consonante por la anterior (si no es letra, se queda igual) 19 Ejercicios propuestos (y IV) 9.- Función que recibe dos strings y devuelve: Si el primero se encuentra dentro del segundo, la posición a partir de la que coinciden Si no, el valor -1 10.- Función que recibe dos cadenas de caracteres y decide si una es permutación de la otra 20