1
resposta

Do While Lendo 2 vezes

Prezados estou com um problema muito estranho no meu código, Quando o rodo o meu programa a repetição do while está rodando duas vezes. Sempre depois que eu tenho alguma interação com o programa.

Segue o código para analise

#include <stdio.h>

#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

void apresentacao() {

printf("*****************\n");
printf("* Jogo da Forca *\n");
printf("*****************\n");

}

void escolhepalavra(char palavrasecreta[20]){ sprintf(palavrasecreta,"MELANCIA"); }

void leialetra(char* chute) { printf("\n Que letra você escolhe? "); scanf("%c", &chute); }

int main(int argc, char *argv[]) { char palavrasecreta[20]; char chute; char acertou = 0; int roda = 0;

//apresentação do Jogo
apresentacao();

//Escolher palavras aleatória
escolhepalavra(palavrasecreta);

do {

    //Pede Letra
    leialetra(&chute);

    roda++;

    printf("\n%d", roda);

} while (!acertou);

return 0;

}

PS quando rodo o código do Professor não acontece.

1 resposta

O problema da execução dupla é por causa do 'scanf("%c", &chute)'. o '%c' lê caractere a caractere inserido, se vc digita 'a' e depois dá um 'enter', o C interpreta isso como dois caracteres, logo, na próxima vez q chegar no 'scanf', ele vai passar direto, colocando o segundo caractere. Você pode testar isso digitando uma palavra, ele vai rodar direto para cada letra e depois uma a mais para o 'enter'. Um jeito fácil de solucionar isso é usando o '%s', ele não vai considerar o 'enter' no final, ficando 'scanf("%1s", &chute);'. Mas isso só vai desconsiderar o 'enter' do final, se for digitada uma palavra, ele ainda vai rodar uma vez para cada letra. Para evitar esse problema, você pode ler a entrada como uma cadeia de caracteres e depois apenas retornar o primeiro caractere dessa cadeia. Segue exemplo:

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

#pragma warning(disable:4996) //Desabilita o warning do scanf depreciado

void apresentacao() 
{
    printf("*****************\n");
    printf("* Jogo da Forca *\n");
    printf("*****************\n");
}

void escolhepalavra(char palavrasecreta[20]) 
{ 
    sprintf_s(palavrasecreta, 20, "MELANCIA"); 
}

void leialetra(char& chute) //Mudei de ponteiro para referência, para que o main receba adequadamente
{
    char entrada[255]; //Até 255 caracteres, vai funcionar
    printf("\n Que letra você escolhe? ");
    scanf("%s", entrada);
    chute = entrada[0]; //pego o primeiro caractere da cadeia
}

int main(int argc, char* argv[])
{
    char palavrasecreta[20];
    char chute = ' ';
    char acertou = 0;
    int roda = 0;

    //apresentação do Jogo
    apresentacao();

    //Escolher palavras aleatória
    escolhepalavra(palavrasecreta);

    do 
    {
        //Pede Letra
        leialetra(chute);
        printf("\n%c", chute);

        roda++;

        printf("\n%d", roda);

    } while (!acertou);

    return 0;
}