/****************************************************************/
/* soubor SLOVA.C */
/* provede nacteni vstupniho textu, jeho rozlozeni na slova */
/* a z techto slov vytvori seznam s jejich cetnosti vyskytu. */
/* Na zaver vytiskne slova a jejich cetnosti. */
/****************************************************************/
#include <stdio.h>
#include <string.h>
#include <alloc.h>
#include <ctype.h>
#include <conio.h>
#define DELKA_RADKU 80
#define PAGE 24
/* typedef struct info; */
typedef struct struct_info {
int pocet;
char *slovo;
struct struct_info *dalsi;
} info;
void odstran_neslova(char *ptr)
/* odstrani mezery, tabelatory a znaky CR, LF ze zacatku retezce */
{char *pom;
pom = ptr;
if (strlen(ptr) == 0)
return;
while ((*pom != '\0') && ((*pom == 0x20) || (*pom == '\t') ||
(*pom == '\n') || (*pom == '\r') ||
(!isalnum(*pom)))
)
{pom++;}
strcpy(ptr, pom);
} /* void odstran_neslova(char *ptr) */
void vrat_slovo(char *r, char *s)
{
int i = 0;
while ((r[i] != 0x0) && (isalnum(r[i]) || (r[i] == '_')))
{i++;} /* while */
if (i == 0)
{*s = 0x0;}
else
{strncpy(s, r, i);
s[i] = 0x0;
strcpy(r, r + i);
}
} /* void vrat_slovo(char *r, char *s) */
void pridej_slovo(info **prvni, char *s)
{
info *prvek;
prvek = *prvni;
while (prvek != NULL)
{
if (strcmp(s, prvek->slovo) == 0)
{(prvek->pocet)++;
return;
}
prvek = prvek->dalsi;
}
prvek = malloc(sizeof(info));
prvek->slovo = malloc(strlen(s) + 1);
strcpy(prvek->slovo, s);
prvek->pocet = 1;
prvek->dalsi = *prvni;
*prvni = prvek;
} /* void pridej_slovo(info **prvni, char *s) */
void tiskni(info *prvni)
{
int vytisknuto = 0;
while (prvni != NULL)
{
printf("%4d..%s\n", prvni->pocet, prvni->slovo);
prvni = prvni->dalsi;
vytisknuto++;
if ((vytisknuto % PAGE) == 0)
{
printf("pro pokracovani stiskni klavesu");
getch();
printf("\n");
}
}
} /* void tiskni(info *prvni) */
int main(int argc, char **argv)
{
info *prvni = NULL;
char radek[DELKA_RADKU + 1], slovo[DELKA_RADKU + 1];
FILE *f;
if (argc != 1)
f = fopen(argv[1], "rt");
else
f = stdin;
if (f == NULL)
return(1);
while (fgets(radek, DELKA_RADKU, f) != NULL)
{
odstran_neslova(radek);
while (strlen(radek) != 0)
{vrat_slovo(radek, slovo);
odstran_neslova(radek);
pridej_slovo(&prvni, slovo);
}
}
tiskni(prvni);
return 0;
} /* int main(int argc, char **argv) */