Il problema è che l'esercizio mi dice di utilizzare proprio quel programma!

Comunque il codice del programma è questo:

file principale (progetto.c)
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
 }

 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 ;
 }
}
file con estensione .h (progetto.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);
file con estensione .c (prog.c)
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; //priga è il contatore delle righe
 char *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);
   }

//printf("Ho scritto: %s\n",parola);

   //Quando leggo con fgets viene aggiunto un carattere alla fine della stringa letta. Quindi confrontando la parola letta, non verrà mai trovata nel testo a meno che non  sia alla fine. Per rimediare tolgo questo carattere
   parola[strlen(parola) - 1] = '\0'; 

   priga=1;
   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(fprintf(fileOut, "%d\n", priga) == EOF){ //scrivo il numero della riga nel file di output
         printerror("Errore nella scrittura della riga 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;
}
e questo è il file 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