#include #include #include //fce pro test zda znak vyhovuje pozadavkum //ted nastaveno pro velka a mala pismena, pro _ a - ve slove int jealfanum(char *pismeno){ if ((((int)(*pismeno)>=97)&&((int)(*pismeno)<=122))|| (((int)(*pismeno)>=65)&&((int)(*pismeno)<=90))|| ((int)(*pismeno)==95)||((int)(*pismeno)==45)) return 1; return 0; }; /*******************************************************************************/ //nacte slovo ze souboru char *getWord(FILE *f) { char *buffer, *pombuffer; unsigned pos = 1; unsigned size = 8; buffer = malloc(size); if (feof(f)) return NULL; //nacita znaky dokud nedojde na zacatek slova while ((fread(buffer, 1, 1, f))&&(!(jealfanum(buffer)))); //nacte slovo while (fread(buffer + pos, 1, 1, f)) { if (!jealfanum(&buffer[pos])) { buffer[pos] = 0; return buffer; } else { ++pos; //pokud nestaci buffer tak se zvetsi na dvojnasobek if (pos == size) { size; pombuffer = malloc(size * 2); memcpy(pombuffer, buffer, size); size *= 2; free(buffer); buffer = pombuffer; } } } buffer[pos] = 0; return buffer; } /*********************************************************************************/ //zkusi jestli slovo odpovida danemu vyrazu int vyzkousej(char *slovo,char *vyraz){ int i=1; if ((!vyraz[0])&&(!slovo[0])) return 1; if ((!vyraz[0])&&(slovo[0])) return 0; if ((vyraz[0])&&(!slovo[0])) return 0; if ((*vyraz) == '?') return(vyzkousej(slovo+1,vyraz+1)); if (((*vyraz) == '*')&&(vyraz[1])) { while ((slovo[i])&&((slovo[i])!=(vyraz[1]))) i++; //dosli jsme na konec radku if (!slovo[i]) return 0; //slovo[i]=vyraz[1] else return(vyzkousej(slovo+i+1,vyraz+2)); } if ((*vyraz) == '*') return 1; if ((*vyraz)==(*slovo)) return(vyzkousej(slovo+1,vyraz+1)); return 0; }; /********************************************************************************/ //cyklus ktery testuje vsechny slova ze souboru a pokud se shoduji tak je tiskne hledej(FILE *soubor,char *vyraz){ char *slovo; slovo=getWord(soubor); while (slovo){ if (vyzkousej(slovo,vyraz)) printf("%s \n",slovo); free(slovo); slovo=getWord(soubor); } }; /*****************************************************************************/ //hlavni funkce stara se o nacteni vstupnich dat a otevreni a zavreni souboru void main(){ char *filename,*vyraz,*pom; FILE *soubor; filename=malloc(sizeof(char)*15); pom=malloc(sizeof(char)*15); vyraz=malloc(sizeof(char)*20); strcpy(filename,"txt.txt"); printf("Zadejte soubor pro vyhledavani (t=default txt.txt): "); scanf("%s",pom); if (!((pom[0]=='t')&&(!pom[1]))) {free(filename);filename=pom;}; printf("\n"); printf("Zadejte regularni vyraz ktery se ma vyhledavat : "); scanf("%s",vyraz); printf("\n"); soubor=fopen(filename,"rt"); if(!soubor) {printf("Soubor neexistuje nebo zadan spatny nazev");return;} hledej(soubor,vyraz); fclose(soubor); return; }