PDA

Visualizza la versione completa : [C] Aggiunta di parole a una stringa


Tusken
23-06-2012, 17:59
Ciao a tutti, ho un problema con un programma in C.
Dovrebbe leggere un file di testo e contare quante volte la stessa sequenza di parole viene ripetuta al suo interno.
Avevo pensato di iniziare copiando il testo in una stringa a parte in modo da eliminare tutti i caratteri per cui isalpha restituisce 0, così da avere solo le parole intervallate da uno spazio (con un'apposita condizione).
Tuttavia non riesco ad aggiungere parole all'array, probabilmente faccio confusione con i puntatori (non c'è un limite al numero di parole, quindi la memoria dev'essere allocata dinamicamente).
Compilando il programma mi dà dei warning su strcat e eseguendolo va in crash.
Vorrei chiedere qual è l'errore e, se possibile, qualche indizio su come procedere per il resto del programma (o eventualmente se c'è un metodo migliore per analizzare il testo senza contare i caratteri diversi dalle lettere).
Di seguito posto la parte di codice finora realizzata.
Grazie a tutti dell'aiuto!


#include<stdio.h>
#include<ctype.h>
#include<string.h>
int main(){
char s, word[100], *a1=malloc(sizeof(char)), *a2=malloc(sizeof(char));
int i=0;
FILE *fp;
if((fp=fopen("file.txt", "r"))==NULL){
printf("Il file non risulta accessibile");
return 0;
}
else{
s=fgetc(fp);
while(!feof(fp)){
i++;
if(isalpha(s) || s==' '){
a2=a1;
a2=realloc(a1, sizeof(char)*(i+1));
strcat(a2, s);
}
s=fgetc(fp);
}
printf("%s", a2);
fclose(fp);
getch();
}
}

Who am I
23-06-2012, 20:41
Utilizzi male la strcat, s è un carattere, non una stringa.Ecco il motivo del warning, la strcat accetta come parametri due stringhe cioè due puntatori a char (ma non risolvi la questione passando &s come parametro, perché una stringa deve contenere anche il terminatore).
Altro problema: tu hai allocato dinamicamente la memoria puntata da a1 e a2, ma poi ha dichiarato:



a2=a1;


Questo significa che l' area di memoria puntata da a2 rimane allocata eppure non la utilizzi, c'è uno spreco di memoria.

Per quanto riguarda il metodo, quello che ti consiglio è di leggere il file riga per riga e di allocare prima un grande array che contiene tutte le stringhe.
Dopodichè procedi col contare le sequenze di parole.

Tusken
23-06-2012, 23:37
Grazie per la pronta risposta!
Sono riuscito a memorizzare le righe del file in un array di stringhe allocato dinamicamente.
La mia intenzione ora è di scansionare tutti i caratteri di ogni riga ed eliminare dall'array-stringa gli elementi non alfabetici e successivamente memorizzare ogni sequenza intervallata da spazi in un nuovo array di stringhe più corte (ovvero le singole parole).
Credi possa funzionare o c'è un metodo migliore che non implica la creazione di nuovi array?
Grazie ancora!

Who am I
24-06-2012, 02:25
Puoi farlo direttamente mentre leggi da file: tieni traccia di ogni stringa che hai letto fino a quando non hai trovato uno spazio o un carattere non alfabetico.Poi la allochi dinamicamente e la aggiungi all' array.

Loading