2011-05-25 140 views
-1

我有这个最后的工作项目,我一直在过去的日子里,我吓坏了,因为截止日期在这里,我找不到我的代码有什么问题,我所做的一切给了我“分段错误”错误,但是当我编译它不会给我任何错误。 下面是链接到代码波纹管: http://pastebin.com/tqWc6Dd0 而这里是代码本身:(但我建议使用链接,并忽略评论,葡萄牙语的胡言乱语)。C错误,需要帮助

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

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("\n e 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(tempor<lstNavio->codigonavio){ 
      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(tempor<lstNavio->codigonavio){ 
      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); 
    } 
} 

谢谢你的时间。

+1

如果你想要一个答案,你需要A)*写一个问题*,B)选择一个有用的主题,并C)格式化你的代码,让人们可以阅读它! – 2011-05-25 17:51:51

+1

“分段错误”表示您的程序访问您不应该访问的内存,例如,通过取消引用NULL指针。试着将你的代码剥离到最低限度,以查看出了什么问题 - 恐怕,这么大量的代码不会给你带来太多的帮助。 – BjoernD 2011-05-25 17:52:21

+0

您正在使用scanf - 一种经典的错误,会导致您陈述的症状是忘记正确使用&运算符与参数。 – JustJeff 2011-05-25 17:53:07

回答

1

检查fscanf调用。有时你不应该在地址上传递。

例如,在listarnavios

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

lstNavio->nomenavio,而不是&lstNavio->nomenavio,这不是唯一的一个。