Ir ao conteúdo

C segmentation fault, não acho o problema!


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

Posts recomendados

Postado

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

  • Membro VIP
Postado

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
Postado

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

Postado

@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]);
  }
}

 

  • Membro VIP
  • Solução
Postado

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
Postado

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]);
  }
}

 

  • Membro VIP
Postado
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
Postado

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]);
  }
}

 

  • Membro VIP
Postado

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
Postado

@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]);
  }
}

 

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