C错误,需要帮助

时间:2011-05-25 17:49:31

标签: c

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

#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 个答案:

答案 0 :(得分: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,而且这不是唯一的。

相关问题