1
resposta

erro linguagem c - linguagem c II - erro segmentation fault

estou fazendo o curso de linguagem c no curso c II, e está dando um erro que não estou conseguindo saber onde está o erro.

erro: [1] 21874 segmentation fault (core dumped) ./"forca"

por favor se alguém puder me ajudar eu vou ficar muito agradecido

eu estou uando gnu/linux fedora 34

codigo:

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

// header filese
#include "forca8.h"


char chutes[26];
int chutesDados = 0;
char palavraSecreta[20];

int jaChutou(char letra){
    int achou = 0;

    for (int j = 0; j < chutesDados; j++){
        if (chutes[j] == letra)
        {
            achou = 1;
            break;
        }

    }
    return achou;
}
void abertura(){
    printf("**************************************\n");
    printf("*******   JOGO DA FORCA   ************\n");
    printf("**************************************\n");
}

void chuta(){
        char chute;

        // tem que colocar espaco antes %c para dar um buf
        printf("\t:");
        scanf(" %c", &chute);

        chutes[chutesDados] = chute;
        chutesDados++;
}
void desenharFoca(){

    for (int i = 0; i < strlen(palavraSecreta); i++){

        int achou = jaChutou(palavraSecreta[i]);

        if(achou){
            printf("%c ", palavraSecreta[i]);

        }else{

        printf("_ ");
        }
    }
}

void escolherPalavra(){

    // declarando variavel aquivo / é um ponteiro

    FILE* f;

    // abrir o aquivo 
    f = fopen("palavras.txt", "r");

    int qtdPalavras;
    fscanf(f, "%d", &qtdPalavras);

    srand(time(0));
    int randomico = rand() % qtdPalavras;


    for(int i =0 ; i <= randomico; qtdPalavras){
        fscanf(f, "%s", palavraSecreta);

    }
    // fechando arquivo
    fclose(f);

}
int acertou(){
    for(int i = 0; i < strlen(palavraSecreta); i++){
        if(!jaChutou(palavraSecreta[i])){
            return 0;
        }
    }
    return 1;

}

int enforcou(){
    int erros = 0;

    for(int i = 0; i < chutesDados; i++){
        int existe = 0;
        for(int j = 0; j<strlen(palavraSecreta); j++){
            if(chutes[i] == palavraSecreta[j]){
                existe = 1;
                break;
            }


        }
        if(!existe) erros++;

    }
    return erros >= 5 ;


}
int main(){


    printf("%s \n", palavraSecreta);



    escolherPalavra();
    abertura();


    do{
        desenharFoca();
        printf("\n");

        chuta(chutes, &chutesDados);

    } while (!acertou() && !enforcou());

    return 0;

}
1 resposta

Olá, Jonas! Tudo bem?

Esse erro mostra que você está alocando memória insuficiente para sua variável e acessa regiões de memória não alocadas. O arquivo palavra .txt está na mesma pasta onde está rodando o programa? Vale lembrar que a primeira linha do arquivo deve ter a quantidade de palavras que está nele. No arquivo deve ter algo como:

 

4

MELANCIA

MELAO

ABACAXI

MANGA

 

Além disso, no trecho do código abaixo o ideal é que no lugar de qtdPalavras tenhamos um i++ para que o valor de i seja atualizado e quem algum momento a condição passe a não ser respeitada e saia do loop

    for(int i =0 ; i <= randomico; qtdPalavras){
        fscanf(f, "%s", palavraSecreta);
    }

Poderíamos escrever da seguinte forma e com isso o i, em algum momento passaria a ser maior que o randomico, parando o loop.

    for(int i =0 ; i <= randomico; i++){
        fscanf(f, "%s", palavraSecreta);
    }

Caso ainda sim o problema persista estou à disposição.

Aguardo retorno.

Abraços!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software