Segmetation Fault
Boa noite gente, eu to estudando pra uma prova de Estrutura de Dados, mas não consigo fazer funcionar um código, ele dar o erro Segmentation Fault, alguém poderia me ajudar?
Os dois primeiros são os mais importantes, o erro dar no segundo código, na primeira função, já to há 1h trancado nisso =/
Segue abaixo o código:
#ifndef PRATICA01_H
#define PRATICA01_H
#ifdef __cplusplus
extern "C" {
#endif
#define NUM_ITENS 100
typedef struct item {
char* descricao;
int quantidade;
float preco;
} Item;
typedef struct lista {
Item* lista;
int tamanho;
} ListaItens;
int le_arquivo(char *c, ListaItens *lista);
int escreve_arquivo(char *c, ListaItens *lista);
void processa_reajuste(ListaItens *lista, float f);
void ordena_por_menor_preco(ListaItens *lista);
void ordena_por_maior_quantidade(ListaItens *lista);
#ifdef __cplusplus
}
#endif
#endif / PRATICA01_H /
#include "pratica01.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int le_arquivo(char c, ListaItens l){
FILE *fp;
char linha[250];
char *aux;
int i;
i=0;
if((fp = fopen(c,"r"))==NULL){
printf("Arquivo não encontrado");
exit(1);
}
fp = fopen(c,"r");
while(fgets(linha,sizeof(linha),fp)!=NULL){
Item produto;
printf("7");
aux = strtok(linha,";");
produto.descricao = (char *)malloc(strlen(aux)+1);
strcpy(produto.descricao,aux);
produto.quantidade = atoi(strtok (NULL,";"));
produto.preco = atof(strtok (NULL,";"));
l->lista[i] = produto;
i++;
}
fclose(fp);
return i;
}
int escreve_arquivo(char c, ListaItens itens){
int i =0;
FILE *fp;
fp = fopen(c,"w");
for(i=0;i<itens->tamanho;i++){
fprintf(fp,"%s;%d;%.2f\n",itens->lista[i].descricao,itens->lista[i].quantidade,itens->lista[i].preco);
}
fclose(fp);
return i;
}
void processa_reajuste(ListaItens* itens, float f){
int i =0;
for(i=0;i<itens->tamanho;i++){
/*Item it;
it = itens->lista[i];
it.preco = it.preco+((f/100.0)*it.preco);
itens->lista[i]=it;
Minha versão*/
itens->lista[i].preco*=(f/100)+1;
}
}
void ordena_por_menor_preco(ListaItens* itens){
int i =0;
int j =0;
Item it;
for(i=0;i<itens->tamanho;i++){
for(j=0;j<itens->tamanho;j++){
if(itens->lista[i].preco<itens->lista[j].preco){
it = itens->lista[j];
itens->lista[j] = itens->lista[i];
itens->lista[i] = it;
}
}
}
}
void ordena_por_maior_quantidade(ListaItens* itens){
int i =0;
int j =0;
Item it;
for(i=0;i<itens->tamanho;i++){
for(j=0;j<itens->tamanho;j++){
if(itens->lista[i].quantidade>itens->lista[j].quantidade){
it = itens->lista[j];
itens->lista[j] = itens->lista[i];
itens->lista[i] = it;
}
}
}
}
#include "pratica01.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char** argv) {
if (argc < 4 || argc > 5) {
printf("Erro: Numero de parametros invalido!\n");
printf("Sintaxe: main_p01 <nome_do_arquivo_de_entrada> <nome_do_arquivo_de_saida><percentual_de_reajuste> [-op | -oq]\n");
printf("Opcoes:\n");
printf("-op = ordena por menor preco\n");
printf("-oq = ordena por maior quantidade\n");
return 1;
}
ListaItens itens;
float perc = atof(argv[3]);
if (argc == 4) {
int num = le_arquivo(argv[1], &itens);
if (num) {
itens.tamanho = num;
processa_reajuste(&itens, perc);
escreve_arquivo(argv[2], &itens);
} else {
printf("Erro: Nao foi possivel ler nenhum registro de item.\n");
return 1;
}
} if (argc == 5) {
if (strcmp(argv[4], "-op") == 0 || strcmp(argv[4], "-oq") == 0) {
int num = le_arquivo(argv[1], &itens);
if (num) {
itens.tamanho = num;
processa_reajuste(&itens, perc);
if (strcmp(argv[4], "-op") == 0) {
ordena_por_menor_preco(&itens);
} else if (strcmp(argv[4], "-oq") == 0) {
ordena_por_maior_quantidade(&itens);
}
escreve_arquivo(argv[2], &itens);
} else {
printf("Erro: Nao foi possivel ler nenhum registro de item.\n");
return 1;
}
} else {
printf("Erro: Opcao '%s' invalida!\n", argv[4]);
return 1;
}
}
return 0;
}Discussão (3)
Carregando comentários...