Bloque 5 Tipos de datos compuestos estáticos: arrays, strings y structs Parte II: Strings y structs
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)
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 3 4 0 1 2 3 4 h o a a \0 c b \0
Ejemplo { main() char cadena1[5]; cadena1= hola ; } Error: no se puede asignar toda la cadena de una vez (excepto en la inicialización)
Ejemplo { main() char cadena1[5]= hola ; char cadena2[5]= ab ; if (cadena1==cadena2)... } Error: no se puede comparar toda la cadena de una vez
Librería string.h Contiene una serie de funciones que permiten tratar las cadenas enteras Función Explicación strlen(cadena) strcpy(cadena1,cadena2) Retorna la longitud de la cadena Copia el contenido de la cadena2 a la cadena1 strncpy(cadena1,cadena2,n) strcat(cadena1,cadena2) strncat(cadena1,cadena2,n) strcmp(cadena1,cadena2) strncmp(cadena1,cadena2,n) Copia los n primeros caracteres de la cadena2 a la cadena1 Concatena cadena2 al final de cadena1 Concatena los n primeros caracteres de cadena2 al final de cadena1 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 Igual que strcmp, pero utilizando sólo los n primeros caracteres de las dos cadenas
Leer y escribir cadenas Leer: gets(cadena); No hay & 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 printf("%s", cadena); puts(cadena);
#include <string.h> #include <stdio.h> main() { char a[5],b[5],c[5]; 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
#include <string.h> #include <stdio.h> main() { char a[5],b[5],c[5]; 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
Ejemplo: contar las ocurrencias de una letra en una frase #include <stdio.h> #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);
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);
Estructuras (o registros) Permiten agrupar en una variable elementos de tipos diferentes (campos) Ejemplos: struct { struct { int codigo; char tipo_usuario; } usuario; struct { campos short int R; short int G; short int B; } color; Nombre de la variable char companyia[2]; int numero; } codigo_vuelo;
Acceso a los campos nombre_estructura.nombre_campo Por ejemplo: color.r=255; color.g=0; color.b=100;
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