Ir para conteúdo
Fórum Script Brasil
  • 0

Erro falha de segmentação


4ng3lo

Pergunta

Boa noite a todos.

Escrevi um programa em linguagem C, que não está rodando corretamente. Consigo gravar usando a opção 1 , mas quando tento buscar o produto usando a opção 2 imediatamente recebo e mensagem de erro: falha de segmentação. Já li e reli inúmeras vezes mas não consegui corrigir meu código.

Alguém sabe onde está o erro?

Desde já grato pela atenção.

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

typedef struct{
    char nome[40];
    int peso;
    float preço;
}Produto;

void limparBuffer(void){
    char ch;

    while((ch = getchar()) != '\n' && ch != EOF){

    }
}

Produto* getProdutos(void){
    Produto* produtos;
    int qtd_Produtos;

    system("clear");

    printf("Informe quantos produtos deseja cadastrar: ");
    scanf("%d", &qtd_Produtos);
    limparBuffer();

    produtos = malloc(sizeof(Produto) * qtd_Produtos);

    for(int cont = 0; cont < qtd_Produtos; cont++){
        system("clear");

        printf("Nome do produto: ");
        fgets((produtos + cont)->nome, 40, stdin);

        printf("Peso Produto: ");
        scanf("%d", &(produtos + cont)->peso);

        printf("Valor Produto: ");
        scanf("%f", &(produtos + cont)->preço);
        limparBuffer();
    }

    system("clear");

    return produtos;
}

int buscarProduto(Produto* produtos, const char* nome_Produto){
    int encontrado = 0;

    while(produtos != NULL){
        if(strcmp((produtos)->nome, nome_Produto)){

        }else{
            encontrado = 1;
            break;
        }

        produtos++;
    }

    return encontrado;
}

Produto retornarProduto(Produto* produtos, const char *nomeProduto){
    Produto produto;

    while(produtos != NULL){
        if(buscarProduto(produtos, nomeProduto)){
            produto = *(produtos);
        }

        produtos++;
    }

    return produto;
}

void exibirProduto(Produto* produtos){
    char nome_Produto[40];
    Produto produto;

    printf("Digite nome produto procurado: ");
    fgets(nome_Produto, 40, stdin);

    system("clear");

    if(buscarProduto(produtos, nome_Produto)){

        produto = retornarProduto(produtos, nome_Produto);

        printf("Nome Produto: %s", produto.nome);
        printf("Peso: %d\n", produto.peso);
        printf("Valor: %.2f\n", produto.preço);
    
    }else{

        puts("Produto não encontrado!");
    
    }

    sleep(5);
}

int main(int argc, char* argv[]){
    Produto *produtos;
    int escolha = 0;

    do
    {
        system("clear");

        printf("Menu Principal\n\n");
        printf("(1) - Cadastrar Produtos\n");
        printf("(2) - Buscar Produtos\n");
        printf("(3) - Encerrar Programa\n\n\n");

        printf("?: ");
        scanf("%i", &escolha);

        switch (escolha)
        {
        case 1: produtos = getProdutos(); 
            break;
        case 2:
            exibirProduto(produtos);
        }
    } while (escolha != 3);
    
    system("clear");

    puts("Programa Encerrado!");

    sleep(4);

    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Olá, @4ng3lo:

Geralmente acontece quando se proíbe o software grava/lê segmentos de memória que não lhes pertence.

C.:

int buscarProduto(Produto* produtos, const char* nome_Produto){
    int encontrado = 0;

    while(produtos != NULL){ /*-[!] Seguido pela programação de cadastro para produtos, 
    o arranjo produtos não garante o produto nulo. Enquanto irregularmente continua até uma falha-*/
        if(strcmp((produtos)->nome, nome_Produto)){

        }else{
            encontrado = 1;
            break;
        }

        produtos++;
    }

    return encontrado;
}

 

5 horas atrás, 4ng3lo disse:
Produto retornarProduto(Produto* produtos, const char *nomeProduto){
    Produto produto;

    while(produtos != NULL){
        if(buscarProduto(produtos, nomeProduto)){
            produto = *(produtos);
        }

        produtos++;
    }

    return produto;
}

— Siga o raciocínio: A exceção é o parâmetro nulo (endereço 0), isto é, para valores diferentes de 0 seu laço 'while' continua até uma falha, porque nunca será = 'null'. Suponho que, confundiu-se entre duas estratégias de listar dados [os arranjos e os nós]; sendo didático, escolha arranjos [vetores] e efetue (você mesmo) a correção na programação.  

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...