Ir ao conteúdo
  • Cadastre-se

C segmentation fault (core dumped) !!!


Lucas Pelepek
Ir à solução Resolvido por Ansi C,

Posts recomendados

Bom dia,tarde,noite.

 

Estou um tempo sem programar em C, acabei ficando enferrujado.
objetivo do programa:


Faça um programa que permita o cadastro de 5 logins com e-mail (máximo de 40 caracteres) e senha (máximo de 10 caracteres). Depois, peça para um usuário fazer o login digitando e-mail e senha. Se alguma informação for inválida, repetir. Se for certa, mostrar uma mensagem de confirmação de login e encerrar o programa. (não pode usar struct, nesse caso usei matriz).

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define co 2
#define li 2

int main()
{
  char w[41];
  char x[41];
  char email[co][li];
  int c,l,cont;
  
  for (c=1; c <= co; c++) {
    
    printf("Email numero: %d\n",c);
    printf("email e senha:\n");
    
    for (l = 1; l <= li; l++) {
      
      scanf("%s",&email[c][l]);
      
    }
  }
  printf("\ndigite email: ");
  scanf("%s",&x);
  
  for (c=1; c <= co; c++) {
    
    if (!strcmp(x,email[1][c])) {
      
      printf("\ndigite a senha: ");
      scanf("%s",&w);
      
      if (!strcmp(w,email[2][c])) {
        printf("\nBem vindo");
      }
      else
      {
        printf("\nsenha incorreta");
      }
    }
    else
    {
      printf("\nemail não encontrado");
    }
  }
}

porém acontece o "segmentation fault (core dumped)" geralmente quando acontecia isso erá porque eu tinha esquecido um &, mas não é o caso.
problema ocorre aqui:
 

  printf("\ndigite email: ");
  scanf("%s",&x);

 

Link para o comentário
Compartilhar em outros sites

for (l= 1; l <= li; l++){ scanf("%s",&email[c][l]); } 

Olá @Lucas Pelepek Nesse fragmento o programa acessa locais além da memória reservada para o vetor, pois os índices de um arranjo são determinados na lista de valores que vão de 0 até (N-1), onde N é o tamanho definido para o arranjo na declaração.

 

Está claro pra você ??
Aguardando O.k!

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

opa, bem, eu alterei pra isso: 
 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define co 2
#define li 2

int main()
{
  char w[41];
  char x[41];
  char email[co][li];
  int c,l,cont;

  for (c=0; c < co; c++) {

    printf("Email numero: %d\n",c);
    printf("email e senha:\n");

    for (l = 0; l < li; l++) {

      scanf("%s",&email[c][l]);

    }
  }
  printf("\ndigite email: ");
  scanf("%s",&x);

  for (c=0; c < co; c++) {

    if (!strcmp(x,email[1][c])) {

      printf("\ndigite a senha: ");
      scanf("%s",&w);

      if (!strcmp(w,email[2][c])) {
        printf("\nBem vindo");
      }
      else
      {
        printf("\nsenha incorreta");
      }
    }
    else
    {
      printf("\nemail não encontrado");
    }
  }
}

não sei se foi isso que voce tentou me passar, em qualquer caso, o erro acontece depois dessa parte que você me alertou, ou ainda estou errado?

Link para o comentário
Compartilhar em outros sites

 

36 minutos atrás, Lucas Pelepek disse:

if (!strcmp(w,email[2][c]))

 

Sim, aquele instante do algoritmo também estava errado, se é o não a origem do problema com certeza em alguma instante será. Aqui acima mais uma vez o mesmo erro: acessando locais não reservados da pilha. Você entendeu a minha explicação anterior ? Enfim não se importe em entende-la

 

Aqui segue uma pagina web para leitura e compreensão do seu problema:

https://en.wikipedia.org/wiki/Segmentation_fault

 

Compartilha as novidades sempre.

O.k!

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Solução
4 horas atrás, Lucas Pelepek disse:

if (!strcmp(w,email[1][c]))

 

Esta passagem de caractere como argumento para um parâmetro char* vai causar erro de acesso violado na memória. Ou seja, agora não é mais o arranjo, e sim, o argumento.

 

Documente seus códigos: Um trecho de código nem sempre é o bastante, e sendo de linguagem C, nunca será, o que faz de C uma linguagem de documentação obrigatória.

 

Preste atenção nos sinais de alerta emitidos pelo compilador; pois um erro dessa magnitude não passa despercebido por uma Interface bem configurada. 

 

 

4 horas atrás, Lucas Pelepek disse:

ainda core dump.

Porque você continua a acessar ponteiros/locais da memoria que não podem ser acessados.

 

 

4 horas atrás, Lucas Pelepek disse:

me atrapalhei totalmente na matriz, acho que tenho que refazer.

Desta vez comunica suas intenções por meio de linhas de código comentadas, não precisa ser muito, um linha já basta.

 

Não tenha medo de perguntar, questione sempre, na aula em toda parte O.k! 

Recomendo este site para auto-aprendizagem: https://www.cprogressivo.net/ 

Um excelente apostila online, com vários exercício resolvidos ...

 

 

Pode confiar!

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...