Ing. Informática Programación I Bloque 5-II Bloque 5 Tipos de datos compuestos estáticos: arrays, strings y structs Parte II: Strings y structs Ing. Informática Programación I Bloque 5-II Strings (cadenas de caracteres) Muy parecido a un array de caracteres La diferencia principal es que la cadena debe acabar con el carácter especial ‘\0’ C tiene una librería <string.h> con una serie de funciones que permiten trabajar con la cadena entera (no sólo carácter a carácter como con arrays) Ing. Informática Programación I Bloque 5-II Declaración de strings Declaración: char cadena[5]; Recordar que hay que guardar un carácter para el ‘\0’ Se le puede dar un valor inicial y tratar carácter a carácter: char cadena1[5]=”hola”; char cadena2[5]=”ab”; cadena1[2]=‘a’; cadena2[0]=‘c’; 0 1 2 c b \0 3 4 0 1 2 3 4 h o a a \0 Ing. Informática Programación I Bloque 5-II Ejemplo main() { char cadena1[5]; cadena1=”hola”; } Error: no se puede asignar toda la cadena de una vez (excepto en la inicialización) Ing. Informática Programación I Bloque 5-II Ejemplo main() { char cadena1[5]=”hola”; char cadena2[5]=”ab”; if (cadena1==cadena2) ... } Error: no se puede comparar toda la cadena de una vez Ing. Informática Programación I Bloque 5-II Librería string.h Contiene una serie de funciones que permiten tratar las cadenas enteras Función Explicación strlen(cadena) Retorna la longitud de la cadena strcpy(cadena1,cadena2) Copia el contenido de la cadena2 a la cadena1 strncpy(cadena1,cadena2,n) Copia los n primeros caracteres de la cadena2 a la cadena1 strcat(cadena1,cadena2) Concatena cadena2 al final de cadena1 strncat(cadena1,cadena2,n) Concatena los n primeros caracteres de cadena2 al final de cadena1 strcmp(cadena1,cadena2) Compara las dos cadenas y retorna 0 si son iguales, un entero <0 si cadena1 es alfabéticamente menor que cadena2, y un entero >0 si no strncmp(cadena1,cadena2,n) Igual que strcmp, pero utilizando sólo los n primeros caracteres de las dos cadenas Ing. Informática Programación I Leer y escribir cadenas Leer: gets(cadena); Introduce los caracteres leídos en la variable cadena, hasta que llega al '\n' scanf("%s", cadena); Se para al llegar al '\n', y también al llegar a un espacio en blanco Escribir No hay & printf("%s", cadena); puts(cadena); Bloque 5-II Ing. Informática #include <string.h> #include <stdio.h> main() { char a[5],b[5],c[5]; Programación I Ejemplo strcpy(a,"ab"); strcpy(b,"cd"); strcpy(c,a); strcat(c,b); a[2]='c'; a[3]='d'; printf("%s\n",c); if (strcmp(a,c)) printf("diferentes\n"); else printf("iguales\n"); } Escribe “diferentes” Bloque 5-II Ing. Informática #include <string.h> #include <stdio.h> main() { char a[5],b[5],c[5]; Programación I Ejemplo strcpy(a,"ab"); strcpy(b,"cd"); strcpy(c,a); strcat(c,b); a[2]='c'; a[3]='d'; a[4]='\0'; printf("%s\n",c); if (strcmp(a,c)) printf("diferentes\n"); else printf("iguales\n"); } Escribe “iguales” Bloque 5-II Ing. Informática Programación I Bloque 5-II Ejemplo: contar las ocurrencias #include <stdio.h>de una letra en una frase #include <string.h> #define MAXLIN 100 main() { char frase[MAXLIN], letra; int total = 0, indice; printf("\nFrase: "); gets(frase); printf("\nLetra: "); scanf("%c",&letra); for (indice=0; indice<strlen(frase); indice++) if (frase[indice]==letra) total++; printf("\nLa letra %c aparece %d veces en la frase %s", letra, total, frase); } Ing. Informática Programación I Bloque 5-II Ejemplo: contar las ocurrencias de una palabra en una frase #include <stdio.h> #include <string.h> #define MAXLIN 100 main() { char palabra_frase[MAXLIN], palabra[MAXLIN]; char c = ' '; int total = 0; printf("\nPalabra: "); scanf("%s",palabra); printf("\nFrase: "); while (c!='\n') { scanf("%s%c",palabra_frase, &c); if (strcmp(palabra_frase, palabra)==0) total++; } printf("\nLa palabra %s aparece %d veces en la frase\n", palabra, total); } Ing. Informática Programación I Bloque 5-II Estructuras (o registros) Permiten agrupar en una variable elementos de tipos diferentes (campos) Ejemplos: struct { campos struct { short int R; int codigo; short int G; char tipo_usuario; short int B; } color; } usuario; struct { Nombre de la variable char companyia[2]; int numero; } codigo_vuelo; Ing. Informática Programación I Bloque 5-II Acceso a los campos nombre_estructura.nombre_campo Por ejemplo: color.R=255; color.G=0; color.B=100; Ing. Informática Programación I Bloque 5-II Ejemplo de arrays de estructuras struct { short int R; short int G; short int B; } colores[10]; Declara un array de 10 posiciones (0 a 9), donde cada posición contiene una estructura con tres campos (R, G y B) colores[5].R=0; colores[5].G=0; colores[5].B=255; Pone el color azul (0,0,255) en la posición 5