Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

alfacar90

Falha de segmentação

Recommended Posts

O código abaixo está compilando no gcc, mas na execução está dando falha de segmentação após efetuar a primeira entrada.

Gostaria por favor que alguém identificasse qual o erro no meu código.

 

#include<stdio.h>
#include<stdlib.h>

typedef struct{
char codigo[21];
char descricao[101];
double preco;
}prod;

void armazena(FILE *arq, prod **produtos, int n){
int i;

for(i=0; i<n; i++)
	fprintf(arq, "%s\n%s\n%.2f\n", produtos[i]->codigo, produtos[i]->descricao, produtos[i]->preco);
}

int main(){
int i, n;
FILE *arq= fopen("PRODUTOS.txt", "w+");
prod **produtos;

printf("Informe o numero de produtos a serem cadastrados: ");
scanf("%d", &n);
produtos=(prod**)malloc(n*sizeof(prod*));

for(i=0; i<n; i++){
	printf("\nInforme o codigo, a descricao e o preco do produto %d \n", i+1);
	scanf("%s%101[^\n]%lf", produtos[i]->codigo, produtos[i]->descricao, &produtos[i]->preco);
}
armazena(arq, produtos, n);
free(produtos);
fclose(arq);
return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Por que você está usando ponteiros para ponteiros? Ponteiro para prod é suficiente. Não é necessário fazer casting do retorno de malloc().

 

A solução abaixo é aceitável, considerando que usamos scanf() porque o programa parece ser simples e não ter fins comerciais:

 

#include <stdlib.h>
#include <stdio.h>


typedef struct
{
       char codigo[21];
       char descricao[101];
       double preco;
} prod;

void armazena(FILE *arq, prod *produtos, int n)
{
       int i;

       for(i = 0; i < n; i++)
               fprintf(arq, "%s\n%s\n%.2f\n", produtos[i].codigo, produtos[i].descricao, produtos[i].preco);
}

int main(void)
{
       int i, n;
       FILE *arq= fopen("PRODUTOS.txt", "w+");
       prod *produtos;

       printf("Informe o numero de produtos a serem cadastrados: ");
       scanf("%d", &n);
fgetc(stdin);
       produtos = malloc(n * sizeof (prod));

       for(i = 0; i < n; i++)
{
//		system("cls");
//		system("clear");
               printf("\nProduto %d: \n", i+1);

	printf("\n\tCodigo: "); 	fgets(produtos[i].codigo, sizeof produtos[i].codigo, stdin);
	printf("\n\tDescricao: "); 	fgets(produtos[i].descricao, sizeof produtos[i].descricao, stdin);
	printf("\n\tPreco: "); 		scanf("%lf", &(produtos[i].preco)); fgetc(stdin);

	produtos[i].codigo[ strcspn(produtos[i].codigo, "\n") ] = 0;
	produtos[i].descricao[ strcspn(produtos[i].descricao, "\n") ] = 0;

       }
       armazena(arq, produtos, n);
       free(produtos);
       fclose(arq);
       return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.