1
resposta

Função adicionar nova palavra não funciona, o arquivo só abre para a função escolhepalavra que tem o fclose()

Alguém utilizando o VSCode sabe o que pode ter dado errado?

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

char palavrasecreta[20];
char chutes[26];
int chutesdados = 0;

int main() {
    abertura();
    escolhepalavra();

    do {
        desenhoforca();
        chuta(chutes);
    } while (!ganhou() && !enforcou());
    adicionapalavra();
}


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 ganhou(){
    for (int i = 0; i < strlen(palavrasecreta); i++)
    {
        if(!jachutou(palavrasecreta[i])){
            return 0;
        }
    }
    return 1;
}

void abertura(){
    printf("*********************************************\n");
    printf("****************JOGO DE FORCA****************\n");
    printf("*********************************************\n\n");
}

void chuta(){
    char chute;
    printf("Qual letra? ");
    scanf(" %c", &chute);

    chutes[chutesdados] = chute;
    chutesdados++;
}

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

void desenhoforca(){
    printf("Chute de letra numero %d:\n", chutesdados);
    for(int i = 0; i < strlen(palavrasecreta); i++) {
        if(jachutou(palavrasecreta[i])) {
            printf("%c ", palavrasecreta[i]);
        } else {
            printf("_ ");
        }
    }
    printf("\n");
}

void escolhepalavra(){
    FILE* f;
    int qtdpalavras = 0;

    f = fopen("palavras.txt", "r");
    if(f==0){
        printf("Arquivo/Banco de dados indisponível\n\n");
        exit(1);
    }

    fscanf(f, "%d", &qtdpalavras);
    srand(time(0));
    int randomico = rand() % qtdpalavras;

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

    fclose(f);
}

void adicionapalavra(){
    char queradicionar;
    FILE* f;

    printf("Deseja adicionar nova palavra no banco de dado da forca (S/N)?");
    scanf(" %c", &queradicionar);

    if(queradicionar == 'S'){
        int qtdpalavras;
        char novapalavra[20];

        printf("\nDigite a nova palavra: ");
        scanf("%s", novapalavra);

        f = fopen("palavras.txt", "r+");
        if(f==0){
            printf("Arquivo/Banco de dados indisponível\n\n");
            exit(1);
        }

        fscanf(f, "%i", &qtdpalavras);
        qtdpalavras ++;

        fseek(f, 0, SEEK_SET);
        fprintf(f, "%i", qtdpalavras);

        fseek(f, 0, SEEK_END);
        fprintf(f, "\n%c", novapalavra);
        fclose(f);
    }
}
1 resposta

Olá Rodrigo. Seu código estava fazendo alguma divisão por zero. Eu fiz um ajuste e mudei a ordem das funções, para poder compilar e executar com o GCC:

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

char palavrasecreta[20];
char chutes[26];
int chutesdados = 0;


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


void abertura(){
    printf("*********************************************\n");
    printf("****************JOGO DE FORCA****************\n");
    printf("*********************************************\n\n");
}

void chuta(){
    char chute;
    printf("Qual letra? ");
    scanf(" %c", &chute);

    chutes[chutesdados] = chute;
    chutesdados++;
}

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

int ganhou(){
    for (int i = 0; i < strlen(palavrasecreta); i++)
    {
        if(!jachutou(palavrasecreta[i])){
            return 0;
        }
    }
    return 1;
}

void desenhoforca(){
    printf("Chute de letra numero %d:\n", chutesdados);
    for(int i = 0; i < strlen(palavrasecreta); i++) {
        if(jachutou(palavrasecreta[i])) {
            printf("%c ", palavrasecreta[i]);
        } else {
            printf("_ ");
        }
    }
    printf("\n");
}

void escolhepalavra(){
    FILE* f;
    int qtdpalavras = 0;

    f = fopen("palavras.txt", "r");
    if(!f){
        printf("Arquivo/Banco de dados indisponível\n\n");
        exit(1);
    }

    fscanf(f, "%d", &qtdpalavras);
    srand(time(0));
    int randomico = rand() % 2;

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

    fclose(f);
}

void adicionapalavra(){
    char queradicionar;

    printf("Deseja adicionar nova palavra no banco de dado da forca (S/N)?");
    scanf(" %c", &queradicionar);

    if(queradicionar != 'S' && queradicionar != 's'){ //se diferente de 's' e de 'S', sair.
        printf("Saindo.\n");
        exit(0);
    }

    char novapalavra[20];

    printf("\nDigite a nova palavra: ");
    scanf(" %s", novapalavra);

    FILE* f;

    f = fopen("palavras.txt", "a"); //"a" = append
    if(!f){
        printf("Arquivo/Banco de dados indisponível\n\n");
        exit(1);
    }
    fprintf(f, "%s\n", novapalavra);

    fclose(f);
    printf("A palavra %s foi adicionada.", novapalavra);
    printf("Saindo.\n");

}



int main() {
    abertura();
    escolhepalavra();

    do {
        desenhoforca();
        chuta(chutes);
    } while (!ganhou() && !enforcou());
    adicionapalavra();
}

O arquivo que contém a palavra pode ser aberto em modo de escrita, que grava em qualquer linha, em modo leitura, que não faz gravações, entre outros. Se aberto no modo append, ele somente adiciona conteúdo no última linha, que foi o que fiz por ser a opção mais simples. Uma dica que dou é que if(x == 1) pode ser simplificado para if(x), e if(x == 0) pode ser simplificado para if(!x).

Feliz ano novo e bons códigos.