Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Dúvida no Ex. 1 da Aula 5 - Ponteiros e Endereços de Memória

Boa noite, amigos. Venho tendo problema com o seguinte código:

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

void cabecalho () {
    printf("\n\n");
    printf("***************************\n");
    printf("***    Jogo da Forca    ***\n");
    printf("***       @MopDev       ***\n");
    printf("***************************\n\n");    
}

void chuta (char chutes [26], int* tentativas) {
    char chute;
    scanf(" %c", &chute);

    chutes[(*tentativas)] = chute;
    (*tentativas)++;
}

int confere (char letra, char chutes[26], int tentativas) {
    int encontrou = 0; 

        for(int j=0; j < tentativas; j++) {
            if(chutes[j] == letra) {
                encontrou = 1;
                break;
            }
        }
    return encontrou;
} 

int main () {

    char palavraS [7];

    sprintf(palavraS, "CADEIRA");

    int acertou = 0;
    int enforca = 0;

    char chutes [26];
    int tentativas = 0;

    cabecalho();

    do {
        printf("\n\n");
        for(int i=0; i < strlen(palavraS); i++) {

                int encontrou = confere(palavraS[i], chutes, tentativas);

                if (encontrou == 1){
                        printf("%c ", palavraS[i]);
                } else {
                printf("_ ");
                }

        }

        printf("\n\nDigite a letra que voce acha que esta na palavra secreta: ");
        chuta(chutes, &tentativas);

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

Quando o executo e chuto a letra " A ", ele me imprime um underscore a mais do que deveria.

Dessa forma:


Digite a letra que voce acha que esta na palavra secreta: C

C

Digite a letra que voce acha que esta na palavra secreta: A

C A A _

Digite a letra que voce acha que esta na palavra secreta:

Procurei, procurei, e não encontrei algo que estivesse levando o código a ler mais de uma vez o if inserido no do. Alguém pode me ajudar?

Obs.: Estou usando gcc forca.c -std=c99 -o forca.exe na hora de compilar meu código, pois se compilo direto, aparecem diversos erros de escrita no código.

Obs.2: Só informei isso da Obs.1 pois talvez possa ajudar vocês.

Obrigado pela atenção, estarei no aguardo!

5 respostas

Bom dia !

Matheus,

Creio que o problema em seu código seja justamente o comando de repetição, pois o do...while sempre executa uma vez para depois testar a código.

No caso ele deve testar antes de executar o que se encontra em seu escopo, tente utilizar somente While.

Espero ter ajudado

César, fiz o teste e não deu certo... O código tava funcionando bem, até eu adicionar uma "função ponteiro", no caso, a função confere. Mas enquanto ela estava dentro do main, tudo estava dentro dos conformes. Alguma ideia?

De qualquer forma, obrigado pela ajuda e atenção!

solução!

Boa noite!

Quanto ao problema do C99, é só quanto ao local que as variáveis de contagem dos for estão sendo declaradas, basta declarar elas junto com as demais e sem problemas de compilação. Eu alterei o código para isso e aumentei o tamanho do vetor palavraS, faltou uma posição nele para o terminador de string. O código ficou assim:

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

void cabecalho () {
    printf("\n\n");
    printf("***************************\n");
    printf("***    Jogo da Forca    ***\n");
    printf("***       @MopDev       ***\n");
    printf("***************************\n\n");
}

void chuta (char chutes [26], int* tentativas) {
    char chute;
    scanf(" %c", &chute);

    chutes[(*tentativas)] = chute;
    (*tentativas)++;
}

int confere (char letra, char chutes[26], int tentativas) {
    int encontrou = 0;
    int j;    

    for(j=0; j < tentativas; j++) {
        if(chutes[j] == letra) {
            encontrou = 1;
            break;
        }
    }
    return encontrou;
} 

int main () {

    char palavraS [8];

    sprintf(palavraS, "CADEIRA");

    int acertou = 0;
    int enforca = 0;

    char chutes [26];
    int tentativas = 0;

    int i;

    cabecalho();

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

        for(i=0; i < strlen(palavraS); i++) {

            int encontrou = confere(palavraS[i], chutes, tentativas);

            if (encontrou == 1){
                printf("%c ", palavraS[i]);
            } else {
                printf("_ ");
            }
        }

        printf("\n\nDigite a letra que voce acha que esta na palavra secreta: ");
        chuta(chutes, &tentativas);

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

Oi Matheus, a solução do Murilo resolve para você?

Se sim, não esqueça de marcar a resposta dele como solução. :-)Se não, só avisar aqui que te ajudamos!

Muito obrigado, Murilo! Resolveu aqui sim, era o array de char "palavraS" que requeria mais um espaço.

Mas tenho uma dúvida ainda, a palavra secreta, que é "CADEIRA", tem 7 posições. Então, por quê preciso que o array de char que a contém tenha 8? Envolve aquilo do " \0 " no fim?

Grato pela atenção!

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