Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [C] Errore di segmentazione

    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:

    codice:
    #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:

    codice:
    #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:

    codice:
    #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:

    codice:
    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

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    O.o grazie mille! Non so come sia possibile però devo aver riscritto male il codice! Sono proprio fusa!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.