alfacar90 0 Denunciar post Postado Dezembro 15, 2010 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
guidjos 65 Denunciar post Postado Dezembro 16, 2010 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