我有这个最后的工作项目,我过去几天一直在做,我吓坏了,因为截止日期在这里,我无法找到我的代码有什么问题,我做的一切给了我“分段错误”错误,但是当我编译它不会给我任何错误。 这是以下代码的链接: 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);
}
}
感谢您的时间。
答案 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
,而且这不是唯一的。