Ir ao conteúdo
  • Cadastre-se

C segmentation fault, não acho o problema!


Lucas Pelepek
Ir à solução Resolvido por Pedro Math.pi,

Posts recomendados

bom dia/tarde/noite.

 

questão:

1. Faça um programa para corrigir provas de múltipla escolha. Cada prova tem oito questões, e cada questão vale um ponto, exceto as questões 3 e 8 que valem 2.0 pontos cada uma. O primeiro conjunto de dados a ser lido é o gabarito da prova. Os outros dados são os números dos alunos, e as respostas que deram às questões. Existem 10 alunos matriculados. Calcule e mostre o número e a nota de cada aluno.

 

#include <stdio.h>

int main(void) {

  int x,z,l;
  char y[7],w[7];
  int b[7];
  printf("GABARITO:\n");

for ( x = 1; x < 9; x++) {
  printf("questão:%d\n",x);
  setbuf(stdin,NULL);
  scanf("%c\n",&y[x]);
}
printf("numero de alunos:\n");
setbuf(stdin,NULL);
scanf("%d\n",&z);

for (x=1;x<=z;x++){
printf("aluno:%d\n",x);
for ( x = 1; x < 9; x++) {
  printf("questão:%d\n",x);
  setbuf(stdin,NULL);
  scanf("%c\n",&w[x]);
}                                 //Segmentation fault
    for ( x = 1; x < 9; x++) {
      l= (strcmp (w[x],y[x]));
        if (l==1) {
          b[x]++;
        }
}
}
for ( x = 1; x <= z; x++) {
  printf("aluno:%d\n",x);
  printf("nota:%d\n",b[x]);
}
}

O programa tem vários erros, mas o que está me impedindo de continuar é esse segmentation fault, não faço ideia o do porque isso acontece, sou iniciante em C.
se alguém tiver alguma dica, agradeço : ).

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Bom dia.

Será que é porque você está usando 2 laços de repetição indentado com a mesma variável (x)? Tente trocar pra outra letra o segundo FOR.

 

Aliás, quando você fizer vários laços de repetição, um dentro do outro, não use a mesma letra, pois vai causar várias inconsistências. O laço abaixo muda o x do laço de cima e vira uma bagunça.

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

opa, valeu, Mudei todos o For's pra garantir : ).

#include <stdio.h>

int main(void) {

  int x,z,l,k,j,e,h;
  char y[7],w[7];
  int b[7];
  printf("GABARITO:\n");

for ( x = 1; x < 9; x++) {
  printf("questão:%d\n",x);
  setbuf(stdin,NULL);
  scanf("%c\n",&y[x]);
}
printf("numero de alunos:\n");
setbuf(stdin,NULL);
scanf("%d\n",&z);

for (k=1;k<=z;k++){
printf("aluno:%d\n",x);
for ( h = 1; h < 9; h++) {
  printf("questão:%d\n",h);
  setbuf(stdin,NULL);
  scanf("%c\n",&w[h]);
}                                 //Segmentation fault
    for ( j = 1; j < 9; j++) {
      l= (strcmp (w[j],y[j]));
        if (l==1) {
          b[j]++;
        }
}
}
for ( e = 1; e <= z; e++) {
  printf("aluno:%d\n",e);
  printf("nota:%d\n",b[e]);
}
}

mas agora dá:
Process returned -1073741819 (0xC0000005) .

Link para o comentário
Compartilhar em outros sites

@Math.Pi Edentei e adicionei  "#include <string.h>" caso seja algum problema com o "strcmp", o programa compila, mas dá esses Warning:
 

|28|warning: passing argument 1 of 'strcmp' makes pointer from integer without a cast [-Wint-conversion]|.

 

|28|warning: passing argument 2 of 'strcmp' makes pointer from integer without a cast [-Wint-conversion]|

 

pesquisando parece que tenho que por "*", mas não entendi.

 

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

int main(void) {

  int x,z,l,k,j,e,h;
  char y[7],w[7];
  int b[7];
  printf("GABARITO:\n");

  for ( x = 1; x < 9; x++) {
    printf("questão:%d\n",x);
    setbuf(stdin,NULL);
    scanf("%c\n",&y[x]);
  }
  printf("numero de alunos:\n");
  setbuf(stdin,NULL);
  scanf("%d\n",&z);

  for (k=1;k<=z;k++){
    printf("aluno:%d\n",x);
    for ( h = 1; h < 9; h++) {
      printf("questão:%d\n",h);
      setbuf(stdin,NULL);
      scanf("%c\n",&w[h]);
    }                                 
    for ( j = 1; j < 9; j++) {
      l= (strcmp (w[j],y[j])); //erro
      if (l==1) {
        b[j]++;
      }
    }
  }
  for ( e = 1; e <= z; e++) {
    printf("aluno:%d\n",e);
    printf("nota:%d\n",b[e]);
  }
}

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
  • Solução

Como você está comparando apenas uma letra e não a cadeia toda, tente usar um operador simples (==)

if (w[j] == y[j])

Ou usar o strcmp na cadeia toda, sem índice e sem o uso do FOR.

 l= (strcmp (w,y));

 

 

Lembrando que para as respostas serem iguais ao gabarito, a comparação dos dois vetores deve retornar 0. Para achar a nota, a comparação da cadeira toda não vai ajudar.

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

opa, valeu, agora funcionou, mais ou menos, mesmo colando todas respostas corretas o programa só fala que cada aluno acertou = o numero de alunos. 

exemplo tendo 2 alunos:

aluno 1:

nota:2

aluno2:

nota:2


outra coisa é que ele está lendo 2 vezes do teclado cada vez vem uma questão, pode ser o "setbuf(stdin,NULL);"?.
exemplo:
"questão 1:

a

a

questão 2:

a

a

..."

 

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

int main(void) {

  int x,z,l,k,j,e,h;
  char y[7],w[7];
  int b[7]={0,0,0,0,0,0,0};
  printf("GABARITO:\n");

  for ( x = 1; x < 9; x++) {
    printf("questão:%d\n",x);
    setbuf(stdin,NULL);
    scanf("%c\n",&y[x]);
  }
  z=2;
  for (k=1;k<=z;k++){
    printf("aluno:%d\n",k);
    for ( h = 1; h < 9; h++) {
      printf("questão:%d\n",h);
      setbuf(stdin,NULL);
      scanf("%c\n",&w[h]);
    }
    for ( j = 1; j < 9; j++) {
      if (w[j] == y[j]) ;
        b[j]=1;
    }
  }
  for ( e = 1; e <= z; e++) {
    printf("aluno:%d\n",e);
    printf("nota:%d\n",b[e]);
  }
}

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
9 minutos atrás, Lucas Pelepek disse:


outra coisa é que ele está lendo 2 vezes do teclado cada vez vem uma questão, pode ser o "setbuf(stdin,NULL);"?.
exemplo:
"questão 1:

a

a

questão 2:

a

a

..."

 

 

use fflush(stdin);

 

9 minutos atrás, Lucas Pelepek disse:

opa, valeu, agora funcionou, mais ou menos, mesmo colando todas respostas corretas o programa só fala que cada aluno acertou = o numero de alunos. 

exemplo tendo 2 alunos:

aluno 1:

nota:2

aluno2:

nota:2


 

 

 

Pois é. Você não deu um nome decente aos seus vetores. Eu não pude adivinhar quem era quem. Da próxima você chama aluno de aluno[] e não de w[].

Gabarito, não de b[].

 

Corrija sua comparação. Tem que comparar as notas com gabarito e não com aluno kkkk.

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

usando o fflush(stdin); deu o mesmo resultado.

foi mal, força do habito,mudei.

não entendi, ele está comparando o aluno com o gabarito.

if (alu[j] == gaba[j])
        nota[j]=1; <----- problema aqui talvez?
#include <stdio.h>
#include <string.h>

int main(void) {

  int x,alunos,l,k,j,e,h;
  char gaba[7],alu[7];
  int nota[7]={0,0,0,0,0,0,0};
  printf("GABARITO:\n");

  for ( x = 1; x < 9; x++) {
    printf("questão:%d\n",x);
    fflush(stdin);
    scanf("%c\n",&gaba[x]);
  }
  alunos=1;
  for (k=1;k<=alunos;k++){
    printf("aluno:%d\n",k);
    for ( h = 1; h < 9; h++) {
      printf("questão:%d\n",h);
      fflush(stdin);
      scanf("%c\n",&alu[h]);
    }
    for ( j = 1; j < 9; j++) {
      if (alu[j] == gaba[j])
        nota[j]=1;
    }
  }
  for ( e = 1; e <= alunos; e++) {
    printf("aluno:%d\n",e);
    printf("nota:%d\n",nota[e]);
  }
}

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Então foi isso que eu te disse. Ele está comparando aluno com gabarito. Entendeu?!

Corrija!

adicionado 1 minuto depois

O problema ainda está aqui:


      if (alu[j] == gaba[j])
        nota[j]=1;

A comparação está errada e a instrução da segunda linha também não faz sentido. Se você vai só contar os pontos, deveria ser um contador incrementável.

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

@Math.Pi Consegui arrumar o problema do scanf pedindo duas vezes imput, mudando a posição do \n pra antes do % .

fiz a mudanças que você indicou e mudei o tamanho dos vetores, agora está funcionado corretamente, obrigado pelas dicas.

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

int main(void) {

  int x,alunos,l,k,j,e,h,somanota;
  char gaba[9],respalu[9];
  int nota[9]={0,0,0,0,0,0,0,0,0};
  printf("GABARITO:\n");

  for ( x = 1; x < 9; x++) {
    printf("quest�o:%d\n",x);
    fflush(stdin);
    scanf("\n%c", &gaba[x]);
  }
  alunos=2;
  for (k=1;k<=alunos;k++){
    printf("aluno:%d\n",k);
    somanota=0;
    for ( h = 1; h < 9; h++) {
      printf("quest�o:%d\n",h);
      fflush(stdin);
      scanf("\n%c", &respalu[h]);
    }
    for ( j = 1; j < 9; j++) {
      if (gaba[j] == respalu[j])
        somanota+=1;
    }
    nota[k]=somanota;
  }
  for ( e = 1; e <= alunos; e++) {
    printf("aluno:%d\n",e);
    printf("nota:%d\n",nota[e]);
  }
}

 

Link para o comentário
Compartilhar em outros sites

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!