C error, necesito ayuda

Tengo este proyecto de trabajo final que he estado haciendo en los últimos días y me estoy volviendo loco porque la fecha límite está aquí y no puedo encontrar lo que está mal con mi código, todo lo que hago me da un error de “Falla de Segmentación”, sin embargo, Lo compilo no me da ningún error. Aquí está el enlace al código siguiente: http://pastebin.com/tqWc6Dd0 Y aquí está el código: (sin embargo, recomiendo usar el enlace e ignorar los comentarios, gibberish portugués).

#include #include typedef struct{ char nomenavio; int codigonavio; char tiponavio; int tonelagemnavio; int anonavio; char paisnavio; char armadornavio; }NAVIO; typedef struct{ int numportos; int milhas; int tonelagemtotal; int consumototal; }TOTAL; ///////////////////////////////////////////////////////////&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //FUNCOES DE MENUS///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// int menuprincipal(){ int controlo=0; printf("\n Ola, escolha a opcao desejada:\n\t1-ADICIONAR NOVO NAVIO\n\t2-CARREGAR FICHEIROS\n\t3-LISTAR\n"); scanf("%d", &controlo); return(controlo); } int menulista(){ int controlomenu; printf("\n LISTAGEM DOS NAVIOS!\n Escolha a opcao que pretende\n \t1-LISTAGEM TOTAL DOS NAVIOS\n\t2-LISTAGEM DOS NAVIOS A PARTIR DE UMA CHAVE\n\t3-LISTAGEM A PARTIR DE UM NOME\n"); scanf("%d", &controlomenu); return(controlomenu); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //FUNCOES DE LISTAGEM DOS NAVIOS///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void listarnavios(FILE*lista, NAVIO*lstNavio){ do{ fscanf(lista,"%c %d %c %d %d %c %c\n", lstNavio->nomenavio, &lstNavio->codigonavio, lstNavio->tiponavio, &lstNavio->tonelagemnavio, &lstNavio->anonavio, &lstNavio->armadornavio); printf("%c %d %c %d %d %c %c\n", lstNavio->nomenavio, lstNavio->codigonavio, lstNavio->tiponavio, lstNavio->tonelagemnavio, lstNavio->anonavio, lstNavio->armadornavio); }while(!feof(lista)); } void anonavios(FILE*lista, int criterio, NAVIO*lstNavio){ do{ fscanf(lista,"%c %d %c %d %d %c %c\n", lstNavio->nomenavio, &lstNavio->codigonavio, lstNavio->tiponavio, &lstNavio->tonelagemnavio, &lstNavio->anonavio, lstNavio->armadornavio); if(criterio==lstNavio->anonavio){ printf("%c %d %c %d %d %c %c", lstNavio->nomenavio, lstNavio->codigonavio, lstNavio->tiponavio, lstNavio->tonelagemnavio, lstNavio->anonavio, lstNavio->armadornavio); } }while(!feof(lista)); } void armadornavios(FILE*lista, char criterio, NAVIO*lstNavio){ do{ fscanf(lista,"%c %d %c %d %d %c %c\n", lstNavio->nomenavio, &lstNavio->codigonavio, lstNavio->tiponavio, &lstNavio->tonelagemnavio, &lstNavio->anonavio, lstNavio->armadornavio); if(criterio==lstNavio->armadornavio){ printf("%c %d %c %d %d %c %c", lstNavio->nomenavio, lstNavio->codigonavio, lstNavio->tiponavio, lstNavio->tonelagemnavio, lstNavio->anonavio, lstNavio->armadornavio); } }while(!feof(lista)); } void tonelagemnavios(FILE*lista, int criterio, NAVIO*lstNavio){ do{ fscanf(lista,"%c %d %c %d %d %c %c\n", lstNavio->nomenavio, &lstNavio->codigonavio, lstNavio->tiponavio, &lstNavio->tonelagemnavio, &lstNavio->anonavio, &lstNavio->armadornavio); if(criterio>=lstNavio->tonelagemnavio){ printf("%c %d %c %d %d %c %c", lstNavio->nomenavio, lstNavio->codigonavio, lstNavio->tiponavio, lstNavio->tonelagemnavio, lstNavio->anonavio, lstNavio->armadornavio); } }while(!feof(lista)); } void tiponavios(FILE*lista, char criterio, NAVIO*lstNavio){ do{ fscanf(lista,"%c %d %c %d %d %c %c\n", lstNavio->nomenavio, &lstNavio->codigonavio, lstNavio->tiponavio, &lstNavio->tonelagemnavio, &lstNavio->anonavio, &lstNavio->armadornavio); if(criterio==lstNavio->tiponavio){ printf("%c %d %c %d %d %c %c",lstNavio->nomenavio, lstNavio->codigonavio, lstNavio->tiponavio, lstNavio->tonelagemnavio,lstNavio->anonavio, lstNavio->armadornavio); } }while(!feof(lista)); } void nomepornavio(FILE*lista, char nomedonavio, NAVIO*lstNavio){ do{ fscanf(lista,"%c %d %c %d %d %c %c\n", lstNavio->nomenavio, &lstNavio->codigonavio, lstNavio->tiponavio, &lstNavio->tonelagemnavio, &lstNavio->anonavio, lstNavio->armadornavio); if(nomedonavio==lstNavio->nomenavio){ printf("%c %d %c %d %d %c %c", lstNavio->nomenavio, lstNavio->codigonavio, lstNavio->tiponavio, lstNavio->tonelagemnavio, lstNavio->anonavio, lstNavio->armadornavio); } }while(!feof(lista)); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //FUNCOES DE ADICIONAR REGISTOS////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void adicionareg(FILE *lista, FILE *total, NAVIO *lstNavio, TOTAL *lstTotal){ printf("\ne depois vim aqui parar!"); int tempor; tempor=0; do{ fscanf(lista,"%c %d %c %d %d %c %c\n", lstNavio->nomenavio, &lstNavio->codigonavio, lstNavio->tiponavio, &lstNavio->tonelagemnavio, &lstNavio->anonavio, &lstNavio->armadornavio); if(temporcodigonavio){ tempor=lstNavio->codigonavio; } }while(!feof(lista)); tempor++; printf("\nAdicionar registo do navio:"); printf("\nInsira o nome do navio"); scanf("%c",lstNavio->nomenavio); printf("\nInsira o tipo do navio"); scanf("%c",lstNavio->tiponavio); printf("\nInsira a tonelagem do navio"); scanf("%d",&lstNavio->tonelagemnavio); printf("\nInsira o ano do navio"); scanf("%d",&lstNavio->anonavio); printf("\nInsira o armador"); scanf("%c",lstNavio->armadornavio); printf("\nO novo navio vai ter o codigo %d", tempor); fprintf(lista,"\n%c %d %c %d %d %c %c", lstNavio->nomenavio, tempor, lstNavio->tiponavio, lstNavio->tonelagemnavio, lstNavio->anonavio, lstNavio->armadornavio); lstTotal->numportos=0; lstTotal->milhas=0; lstTotal->tonelagemtotal=0; lstTotal->consumototal=0; fprintf(total, "\n%d %d %d %d %d", tempor, lstTotal->numportos, lstTotal->milhas, lstTotal->tonelagemtotal, lstTotal->consumototal); } void carregarnovos(FILE*lista, FILE*total, FILE*novalista, NAVIO*lstNavio, TOTAL*lstTotal){ int tempor; tempor=0; do{ fscanf(lista,"%c %d %c %d %d %c %c\n", lstNavio->nomenavio, &lstNavio->codigonavio, lstNavio->tiponavio, &lstNavio->tonelagemnavio, &lstNavio->anonavio, lstNavio->armadornavio); if(temporcodigonavio){ tempor=lstNavio->codigonavio; } }while(!feof(lista)); tempor++; lstTotal->numportos=0; lstTotal->milhas=0; lstTotal->tonelagemtotal=0; lstTotal->consumototal=0; do{ fscanf(novalista,"%c %c %d %d %c %c\n",lstNavio->nomenavio, lstNavio->tiponavio, &lstNavio->tonelagemnavio, &lstNavio->anonavio, lstNavio->armadornavio); fprintf(lista, "\n%c %d %c %d %d %c %c", lstNavio->nomenavio, lstNavio->tiponavio, lstNavio->tonelagemnavio, lstNavio->anonavio, lstNavio->armadornavio); fprintf(total, "\n%d %d %d %d %d", tempor, lstTotal->numportos, lstTotal->milhas, lstTotal->tonelagemtotal, lstTotal->consumototal); tempor++; }while(!feof(novalista)); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //FUNCAO MAIN///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// main(){ NAVIO *lstNavio[1]; TOTAL *lstTotal[1]; FILE *lista; FILE *novalista; FILE *total; int ctrlmenuprincipal, ctrlmenulista; int ctrlchave; char criteriochar[20], nomedonavio[30]; int criterioint; char nomenovalista[30]; ctrlmenuprincipal=menuprincipal(); ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //OPCAO 1 do menu principal, permite ao utilizador inserir um novo registo na lista principal.//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// if(ctrlmenuprincipal==1){ lista=fopen("navios.txt", "a+"); if(lista==NULL){ printf("Erro na abertura do ficheiro"); exit(1); } total=fopen("naviosRef.txt", "a"); if(total==NULL){ printf("Erro na abertura do ficheiro"); exit(1); } adicionareg(lista, total, *lstNavio, *lstTotal); fclose(lista); fclose(total); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //OPCAO 2 do menu principal, adicionar a lista principal, os registos que estao na lista novosNavios.txt".//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// if(ctrlmenuprincipal==2){ printf("\nInsira o nome da lista com os novos navios:"); scanf("%c", nomenovalista); lista=fopen("navios.txt", "a+"); if(lista==NULL){ printf("Erro na abertura do ficheiro"); exit(1); } total=fopen("naviosRef.txt", "a"); if(total==NULL){ printf("Erro na abertura do ficheiro"); exit(1); } novalista=fopen("novosNavios.txt", "r+"); if(novalista==NULL){ printf("Erro na abertura do ficheiro"); exit(1); } carregarnovos(lista, total, novalista, *lstNavio, *lstTotal); fclose(lista); fclose(total); fclose(novalista); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //OPCAO 3 do menu principal, listagem de navios, inicia outro menu, que permite ao utilizador escolher o tipo de listagem desejada.//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// if(ctrlmenuprincipal==3){ ctrlmenulista=menulista(); lista=fopen("navios.txt", "r+"); if(lista==NULL){ printf("Erro na abertura do ficheiro"); exit(1); } printf("sera que chego aqui?"); if(ctrlmenulista==1){ printf("bugabuga"); listarnavios(lista, *lstNavio); } if(ctrlmenulista==2){ printf("\nInsira a chave desejada\n\t1-Armador\n\t2-Ano\n\t3-Tipo\n\t4-Tonelagem\n"); scanf("%d", &ctrlchave); printf("%d", ctrlchave); if(ctrlchave==1){ printf("\nInsira o nome do Armador:");scanf("%c\n",criteriochar); armadornavios(lista, *criteriochar, *lstNavio); } if(ctrlchave==2){ printf("\nInsira o Ano:");scanf("%d\n",criterioint); anonavios(lista, criterioint, *lstNavio); } if(ctrlchave==3){ printf("\nInsira o tipo da embarcação:");scanf("%c\n",criteriochar); tiponavios(lista, *criteriochar, *lstNavio); } if(ctrlchave==4){ printf("\nInsira a tonelagem:");scanf("%d\n",criterioint); tonelagemnavios(lista, criterioint, *lstNavio); } } if(ctrlmenulista==3){ printf("\nInsira o nome do navio:"); scanf("%c\n", nomedonavio); nomepornavio(lista, *nomedonavio, *lstNavio); } fclose(lista); } } 

Gracias por tu tiempo.

Compruebe las llamadas fscanf . A veces no estás pasando una dirección cuando deberías.

Por ejemplo, en listarnavios :

 fscanf(lista,"%c %d %c %d %d %c %c\n", lstNavio->nomenavio, &lstNavio-codigonavio, lstNavio->tiponavio, &lstNavio->tonelagemnavio, &lstNavio->anonavio, &lstNavio-armadornavio); 

Tiene lstNavio->nomenavio lugar de &lstNavio->nomenavio , y ese no es el único.