questo è un programma che dati da riga di comando 2 parametri:
1) un numero di 7 cifre da 2 a 9 (come la tastiera del cellulare) genera tutte le parole che comincia per consonante efiniscono per vocale, non hanno una sequenza di 4 consonanti, non hanno una sequenza di 3 vocali e le salva in una lista.
2) il nome di un file contenente una lista di parole.. se trova una parola dalla lista che è stata generata indica la sua posizione la parola e la codifica...

veniamo ora al problema.. genera le parole ma poi mi va in segmentation fail... non riesco a capire dove sia l'errore e per lunedì devo portarlo per un esame.. vi prego di aiutarmi!

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

typedef struct lista_s{
	char* parola;
	struct lista_s *next;
} lista;

char consonanti [21] = {'b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's' , 't', 'v', 'w', 'y', 'x', 'z'};//
char vocali [5] = { 'a', 'e', 'i' ,'o', 'u'};//

int vocale_f (char c);
int consonante_f (char c);
char** function_b (lista** Ptr,int* lung);
void function_c (lista **Ptr);
void function_d(FILE* pointer, char** vett, int index, char * string);
void inserisci_lista ( lista ** Ptr, char *string);
int verifica_parola (char* vett);

int main (int argc, char* argv[])
{
	char Vc[8]; //
	int vett[7];//
	int i,k,k1,k2,k3,k4,k5,k6,L;//inserire inizializzazioni
	char alfabeto [10][4] = { "0000","0000","abc" , "def" , "ghi", "jkl", "mno", "pqrs", "tuv" , "wxyz" };
	char parola [8];//
	FILE *fp;//
	lista *elenco=NULL;
	char** copia;
	
	if (argc != 3) 
		printf("errore argomenti");
	else
	{
		if((sscanf(argv[1], "%s", Vc)!= 1))
			printf("errore argomento");
		else
		{*/
			for (i=0; i<7; i++) {
				//vett[i]=atoi(Vc[i]);
				vett[i]=Vc[i]-'0';
				if (vett[i]==0 || vett[i]==1){
				    printf("errore");
					return 0;
                }
			}
			for (k=0; k<strlen(alfabeto[vett[0]]); k++){
				parola[0]= alfabeto[vett[0]][k];
				for (k1=0; k1<strlen(alfabeto[vett[1]]); k1++){
					parola[1]= alfabeto[vett[1]][k1];
					for (k2=0; k2<strlen(alfabeto[vett[2]]); k2++){
						parola[2]= alfabeto[vett[2]][k2];
						for (k3=0; k3<strlen(alfabeto[vett[3]]); k3++){
							parola[3]= alfabeto[vett[3]][k3];
							for (k4=0; k4<strlen(alfabeto[vett[4]]); k4++){
								parola[4]= alfabeto[vett[4]][k4];
								for (k5=0; k5<strlen(alfabeto[vett[5]]); k5++){
									parola[5]= alfabeto[vett[5]][k5];
									for (k6=0; k6<strlen(alfabeto[vett[6]]); k6++){
										parola[6]= alfabeto[vett[6]][k6];
										if (verifica_parola(parola)){//mancava l'argomento
											//printf("%s\n",parola);
											inserisci_lista(&elenco, parola);//mancavano gli argomenti
										}
									}
								}
							}
						}
					}
				}
			}
			
			copia=function_b(&elenco,&L);//mancavano parametri
			if ((fp=fopen(argv[2], "r"))!=NULL) {
				function_d(fp,copia,L,Vc);//mancavano argomenti
			}
			else 
				printf("impossibile aprire file");
			function_c(&elenco);//mancavano parametri
			
	//	}
	//}
	return 0;
}

int verifica_parola (char* vett)
{
	int trovato = 0,i, counter = 0;
	
	for (i=0;i<20 && !trovato;i++)
		if (vett[0]==consonanti[i])
			trovato = 1;
	if (trovato==1)
	{
		for (i=0;i<5 && trovato; i++)
			if (vett[6] == vocali [i])
				trovato = -1;
	}
	if (trovato==-1) {
		for ( i=1; i<7; i++)
		{
			if (consonante_f(vett[i-1]) && consonante_f(vett[i])) {
				counter++;
				if (counter==4)
					return 0;
			}
			else 
				counter = 0;
		}
		counter = 0;
		for (i=1;i<6;i++)
		{
			if (vocale_f(vett[i]) && vocale_f(vett[i+1]))
			{
				counter++;
				if (counter==3)
					return 0;
			}
			else counter = 0;
		}
		return 1;
	}
	return 0;
}

int vocale_f (char c) //mancava
{
	int i;
	
	for (i=0;i<5 ; i++)
		if (c == vocali [i])
			return 1;
	return 0;
	
}

int consonante_f (char c)//mancava
{
	int i;
	
	for (i=0;i<20;i++)
		if (c == consonanti[i])
			return 1;
	return 0;
}

void inserisci_lista ( lista ** Ptr, char *string)
{
	lista *n_pt, *p_pt, *c_pt;
	
	n_pt =(lista *) malloc(sizeof(lista));
	if (n_pt != NULL)
	{
		strcpy ( n_pt->parola, string);
		n_pt->next = NULL;
		p_pt = NULL;
		c_pt = * Ptr;
		
		while (c_pt != NULL && strcmp(string, c_pt->parola)>0) {//avevo sbagliato e scritto string > c_pt
			p_pt = c_pt;
			c_pt = c_pt->next;
		}
		if (p_pt == NULL) {
			n_pt->next = *Ptr;
			*Ptr = n_pt;
		}
		else {
			p_pt->next =n_pt;
			n_pt->next =c_pt;
		}
		
	}
	else {
		printf("memoria non disponibile");
	}
	
}

void function_c (lista **Ptr)
{
	lista * c_pt;
	while (*Ptr!=NULL) {
		c_pt = *Ptr;
		*Ptr = (*Ptr)->next;
		free(c_pt);
	}
}

char** function_b (lista** Ptr,int* lung)//non avevo messo l'ultimo parametro
{
	int index=0;
	int i;//
	char **vettd;
	lista* temp;
	
	temp = *Ptr; //avevo scritto *temp
	while (*Ptr != NULL) {
		*Ptr= (*Ptr)->next;
		index++;
	}
	*Ptr = temp; //
	*lung= index;  //
	vettd = malloc (index*sizeof(char*));
	for (i=0; i<index; i++) {
		vettd[i] = malloc(7*sizeof(char));
	}
	index=0;
	while (temp != NULL) {//avevo messo *temp
		strcpy(vettd[index],temp->parola);
		temp=temp->next;//avevo scritto *temp=(*temp)->next
		index++;
	}
	return vettd; //non avevo messo vettd
}

void function_d(FILE* pointer, char** vett, int index, char * string) //non avevo mess l'ultimo parametro
{
	char cercato[8];
	int i;
	
	while ((fscanf(pointer, "%s", cercato))!= EOF){ //non avevo messo while
		for (i=0; i<index; i++) {
			if (strcmp(cercato, vett[i])==0)
			{
				printf("indice %d, parola %s, codifica %s\n", index, cercato, string);	
		    }
		}
	}
}