PDA

Visualizza la versione completa : [C] Errore di segmentazione


ChiaraB92
13-06-2013, 09:58
Ciao a tutti! :)
Avevo già chiesto aiuto per questo programma e avevo risolto solo che l'ho dovuto modificare per utilizzare una libreria statica e deve essere compilato tramite Makefile.
Il programma deve stampare una lista di tutte le parole chiave (che trova nel file che gli passo come secondo parametro) che trova nel testo (che è il file che gli passo come primo parametro) sul file che gli passo come terzo parametro con il numero delle righe in cui compaiono.

Questo è il codice del file .h:



#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void printerror(char *str, int n);

void trovaParola(char *parola, FILE *fileOut, FILE *fileIn);

int contaRighe(FILE *fileIn);



Questo è il codice del file .c dove specifico il codice di tutte le funzioni:



#include "progetto.h"

void printerror(char *str, int n)
{
fprintf(stderr, "Errore %d: %s\n", n, str);
exit(n);
}

void trovaParola(char *parola, FILE *fileOut, FILE *fileIn)
{
char t[100];
char *riga;
int priga=1; //priga è il contatore delle righe
int p;
riga = fgets(t, 100, fileIn); // leggo la prima riga del file

// Scrivo la parola chiave nel file di output
if(fputs(parola, fileOut) == EOF){
printerror("Errore nella scrittura della parola nel secondo file.", 3);
}

while (riga != NULL){ //fino alla fine del testo
p = strstr(riga, parola); //guardo se la parola chiave è presente nella riga
if (p != NULL){ // p=NULL se non ha trovato la parola nella riga
if(fputs(priga, fileOut) == EOF){ //scrivo il numero della riga nel file di output
printerror("Errore nella scrittura della parola nel secondo file.", 3);
}
}
riga = fgets(t, 100, fileIn); //vado alla riga successiva
priga++; //incremento il contatore
}
}

int contaRighe(FILE *fileIn)
{
int righe=0, i;
i = fgetc(fileIn);
while (i != EOF){
if (i == '\n'){
righe++;
}
i = fgetc(fileIn);
}
return righe;
}


Questo è il codice del programma principale:



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "progetto.h"

int main(int argc, char *argv[])
{
FILE *fin_t;
FILE *fin_p;
FILE *fout;

char p[20];
char *parola;
int r, i;

int chiudit, chiudip, chiudio;

if (argc != 4){
printerror("Specificare tre file come argomenti.\n", 1);
}

fin_p = fopen(argv[1],"r");
if (fin_p == NULL){
printerror("Errore nell’apertura del secondo file.\n", 2);
}

fin_t = fopen(argv[2],"r");
if (fin_t == NULL){
printerror("Errore nell’apertura del primo file.\n", 2);
}

fout = fopen(argv[3],"w");
if (fout == NULL){
printerror("Errore nell’apertura del terzo file.\n", 2);
}

r = contaRighe(fin_p); //guardo quante parole chiave ho

rewind(fin_p); //rimetto il puntatore all'inizio del file

parola = fgets(p, 20, fin_p);

for(i=0; i<r; i++){ //per quante volte sono le parole chiave
trovaParola(parola, fout, fin_t); //eseguo la funzione trovaParola()
parola = fgets(p, 20, fin_p); //vado alla parola successiva
rewind(fin_t); //rimetto il puntatore all'inizio del file in modo da passarlo tutto ogni volta
}

//printf("Le parole chiave sono: %d\n",r);

chiudit = fclose(fin_t);
if(chiudit == 0){
printf("Chiusura del primo file corretta.\n");
}else{
printf("Errore nella chiusura del primo file.\n");
return ;
}

chiudip = fclose(fin_p);
if(chiudip == 0){
printf("Chiusura del primo file corretta.\n");
}else{
printf("Errore nella chiusura del primo file.\n");
return ;
}

chiudio = fclose(fout);
if(chiudio == 0){
printf("Chiusura del secondo file corretta.\n");
}else{
printf("Errore nella chiusura del secondo file.\n");
return ;
}
}



E questo è il codice del Makefile:



progetto: progetto.o libprog.a
gcc -o progetto progetto.o -L. -lprog
%.o : %.c
gcc -o $@ -c $<
libprog.a: prog.o
ar r libprog.a prog.o
clean:
rm *.o progetto *.a

prog.o: progetto.h
progetto.o: progetto.h


Quando compilo con il comando make non mi da nessun errore ma poi quando esegue il programma mi da errore di segmentazione e non capisco perchè visto che il programma, senza l'uso delle librerie, funziona correttamente.

Grazie mille in anticipo :)

oregon
13-06-2013, 11:04
Mi sembra strano che il compilatore l'abbia compilato e che il precedente programma funzioni visto che in questa riga

if(fputs(priga, fileOut) == EOF){ //scrivo il numero della riga nel file di output

il parametro priga è di tipo incompatibile e che in quest'altra

p = strstr(riga, parola); //guardo se la parola chiave è presente nella riga

p non è un puntatore.


P.S. Nel programma che avevi presentato in precedenza quelle due righe erano diverse, ovvero erano corrette. Qui le hai cambiate ... la libreria non c'entra nulla ...

ChiaraB92
13-06-2013, 17:46
O.o grazie mille! Non so come sia possibile però devo aver riscritto male il codice! Sono proprio fusa!

Loading