#include #include #include void main(void) { // declaración de variables char c, *temp, *frase; int i=0, j, nfrase=0, nchar=6, maxfrases=3; char **pc; // declaración de puntero a fichero FILE *fi; // declaración de funciones char* ampliar(char*, int*); char** ampliar2(char**, int*); // abrir fichero para lectura fi = fopen("texto.d","r"); // memoria para frases de hasta 6 letras frase = calloc(nchar, sizeof(char)); // memoria para punteros a 3 frases pc = calloc(maxfrases, sizeof(char*)); // se leen caracteres hasta llegar al fin de fichero while((c=getc(fi)) != EOF) { if(c !='\n') { if(i==nchar-1) // se amplía frase[] si es necesario frase = ampliar(frase, &nchar); frase[i++] = c; } else { // se ha terminado de leer una frase // se añade la marca de fin de cadena frase[i]='\0'; if(nfrase == maxfrases) // se amplía pc[] si es necesario pc = ampliar2(pc, &maxfrases); pc[nfrase] = calloc(strlen(frase)+1, sizeof(char)); strcpy(pc[nfrase++], frase); i=0; } } // ordenar las frases leídas for(i=0; i0) { temp=pc[i]; pc[i]=pc[j]; pc[j]=temp; } } } fclose(fi); // introducir los resultados en otro fichero // ... } char* ampliar(char* phrase, int* size) { char *nuevo; int i; *size += 10; // se crea un vector con 10 caracteres adicionales nuevo = calloc(*size, sizeof(char)); // se copian los datos antiguos en el vector nuevo for(i=0; i< *size-10; i++) nuevo[i] = phrase[i]; // se destruye el vector viejo free(phrase); // se devuelve un puntero al vector nuevo return(nuevo); } char** ampliar2(char** pc2, int *numero) { char **pc_new; int i; *numero += 5; // se crea un vector con 5 punteros adicionales pc_new = calloc(*numero, sizeof(char*)); // se copian los datos antiguos en el vector nuevo for(i=0; i < *numero-5; i++) pc_new[i] = pc2[i]; // se destruye el vector viejo free(pc2); // se devuelve un puntero al vector nuevo return(pc_new); }