Tiny programs (C, C++, C#, ...)
File detail
Source code
/*
* Soubor: wordcount.c - hlavni modul programu pocitajici slova
* Kamil Dudka, FIT, DU2, priklad 2, 17.4.2005
*/
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include "htable.h" // Rozhrani modulu htable.c
/*
* Velikost tabulky jsem stanovil experimentalne
*/
const unsigned HashInitSize=16384; // Velikost hashovaci tabulky
const unsigned WordBufferSize=256; // Maximalni velikost slova + 1
/*
* Funkce read_word() cte jedno slovo ze souboru do zadaneho pole znaku
* a vrati delku slova (z delsich slov vrati prvnich max-1 znaku,
* a zbytek preskoci). Funkce vraci nulu, pokud je konec souboru.
*/
int read_word (char *, int, FILE *);
/*
* Obsluha nedostatku pameti
*/
inline void errMemory (void) {
fprintf (stderr, "wordcount: Nedostatek pameti!\n");
exit (1);
}
int main () {
// Alokace a inicializace hashovaci tabulky
htable_t *pHash;
if (NULL==( pHash=htable_init (HashInitSize)))
errMemory ();
// Buffer pro nacteni jednoho slova
char wordBuffer [WordBufferSize];
// Cyklus pocitajici jednotliva slova
while (read_word (wordBuffer, WordBufferSize, stdin)) {
struct htable_listitem *item;
if (NULL==( item=htable_lookup (pHash, wordBuffer))) {
htable_free (pHash);
errMemory ();
}
// Inkrementace pocitadla
item->n ++;
}
// Tisk obsahu tabulky
htable_print (pHash);
// Uvolneni hashovaci tabulky
htable_free (pHash);
}
int read_word (char *buffer, int max, FILE *input) {
int size=0;
register int tmp;
// Preskoceni mezer
while (EOF!=( tmp=fgetc (input)) && isspace(tmp));
// Nacteni slova
while (EOF!=tmp && !isspace(tmp)) {
if (size<max-1) {
*buffer = tmp;
buffer++;
size++;
}
tmp = fgetc(input);
}
// Zakonceni nulou
*buffer = '\0';
// Vraci pocet nactenych (skutecne ulozenych) znaku
return size;
}