#include #include #include struct sana { struct sana *seur; char sana[1]; }; /* luetaan muistiin mielivaltaisen pitkä rivi * varataan lisää muistia kunnes mahtuu * tai muisti loppuu */ #define ASKEL 5 char *luerivi(void) { static char *p = NULL; static int tila = ASKEL; int pituus; /* ensimmäinen kutsu */ if (!p) { if (!(p = malloc(tila))) { fprintf(stderr,"Muisti loppui\n"); exit(EXIT_FAILURE); } } /* luetaan niin paljon kuin mahtuu */ if (!fgets(p, tila, stdin)) { return NULL; } /* jos lopussa ei ole \n, rivi on vielä vajaa */ while (p[(pituus=strlen(p))-1] != '\n') { /* varataan lisää tilaa */ if (!(p = realloc(p, tila+=ASKEL))) { fprintf(stderr,"Muisti loppui\n"); exit(EXIT_FAILURE); } /* luetaan lisää niin paljon kuin nyt mahtuu */ if (!fgets(p+pituus, tila-pituus, stdin)) { return NULL; } } p[--pituus]='\0'; /* ei palauteta \n:ää */ return p; } int main(int argc, char **argv) { int pituus, lkm=0, i; char *tmpsana; struct sana *alku = NULL, *uusi; if (argc != 2 || 1 != sscanf(argv[1], "%d", &pituus)) { printf("Anna haluttu sanapituus argumenttina\n"); exit(EXIT_FAILURE); } while ((tmpsana=luerivi())) { if (strlen(tmpsana) == pituus) { #ifdef DEBUG printf("%s\n", tmpsana); #endif uusi = malloc(sizeof(struct sana) + pituus); if (!uusi) { fprintf(stderr,"Muisti loppui\n"); exit(EXIT_FAILURE); } strcpy(uusi->sana, tmpsana); uusi->seur = alku; alku = uusi; lkm++; } } printf("Yhteensä %d kpl %d-kirjaimisia sanoja\n", lkm, pituus); for (uusi=alku, i=lkm/2; uusi; uusi = uusi->seur) { if (!i--) printf("Keskimmäinen sana on \"%s\"\n", uusi->sana); } return 0; }