Originariamente inviato da dexter86
Un pochino più lungo dici

VVoVe: ??? A parte gli scherzi ti ringrazio moltissimo per lo sforzo. Ora vedrò di studiarmelo.
Si, leggermente
questo è il codice modificato per il tuo problema:
codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <time.h>
#include <ctype.h>
typedef enum tagStati
{
S_ERROR_OPEN_FILE = -2,
S_ERROR = -1,
S0 = 0,
S1
} Stati;
Stati DFA(char *szFileName, const char *parola, int *occorrenze)
{
Stati stato = S0;
FILE *fp;
char *buffer;
char szTemp[256];
char c;
int numread = 0;
int k = 0;
int x = 0;
int dimFile = 0;
fpos_t pos;
*occorrenze = 0;
fp = fopen(szFileName, "rb");
if ( fp == NULL )
return S_ERROR_OPEN_FILE;
if ( fseek(fp, 0, SEEK_END) )
return -1;
if( fgetpos(fp, &pos) != 0 )
return -1;
dimFile = (int)pos;
if ( fseek(fp, 0, SEEK_SET) )
return -1;
buffer = (char*)malloc(sizeof(char)*dimFile + 1);
if ( !buffer )
{
printf("Errore nell'allocazione della memoria.");
fclose(fp);
return -1;
}
numread = fread(buffer,
sizeof(char),
dimFile,
fp);
if ( numread != dimFile )
{
fclose(fp);
return -1;
}
*(buffer + numread + 1) = '\0';
while ( k < dimFile )
{
c = *(buffer + k++);
switch (stato)
{
case S0:
if ( isalnum(c) || c == 'è' || c == 'é' || c == 'ì' || c == 'à' || c == 'ù' || c == 'ò' )
{
*(szTemp + x++) = c;
stato = S1;
}
else
{
stato = S0;
}
break;
case S1:
if ( isalnum(c) || c == 'è' || c == 'é' || c == 'ì' || c == 'à' || c == 'ù' || c == 'ò' )
{
*(szTemp + x++) = c;
stato = S1;
}
else
{
*(szTemp + x) = '\0';
x = 0;
if ( strcmp(szTemp, parola) == 0 )
(*occorrenze)++;
stato = S0;
}
break;
}
}
free(buffer);
if ( fp )
fclose(fp);
return stato;
}
int main()
{
Stati stato;
clock_t c_start, c_end;
//char *parola = "principessa";
//char *parola = "primogenito";
char *parola = "rivoluzione";
int occorrenze;
char *szNomeFile = "romanzo.txt";
c_start = clock();
stato = DFA(szNomeFile, parola, &occorrenze);
if ( stato == S0 || stato == S1 )
{
if ( occorrenze > 0 )
printf("\n\nSono state trovate %d occorrenze della parola %s\n\n", occorrenze, parola);
else
printf("\n\nNessuna occorrenza della parola %s\n\n", parola);
}
else
{
printf("\nL'automa ha restituito un errore.\n");
}
c_end = clock();
printf("\n\nTempo impiegato -> %5.5f secondi\n", (double)(c_end - c_start) / CLOCKS_PER_SEC);
return 0;
}
È un pochino più corto rispetto al precedente in quanto non c'è bisogno di usare l'albero binario e le relative funzioni.
Sulla mia macchina(provando sempre sul file indicato nel post precedente) vola: 0,00000 secondi