2
respostas

Codigo executa bem, mas o printf() repete duas vezes sem motivo aparente

Codigo:

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

int main() {

    char palavrasecreta[20];
    sprintf(palavrasecreta, "melancia");

    int acertou = 0;
    int enforcou = 1;
    char chute;

    do {
        printf("Digite uma letra: ");
        scanf("%c", &chute);

        for(int i = 0; i < strlen(palavrasecreta); i++){
            if(chute == palavrasecreta[i]){
                printf("a posicao %d contem a letra %c\n", i, palavrasecreta[i]);
            } 
        }

    } while(acertou == 0);

}

Saida:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Como podem observar, o "Digite uma letra: " se repete duas vezes antes de executar o scanf() novamente

2 respostas

Descobri que o problema esta em relacao ao scanf de um char, se substituir para um int o problema para de acontecer Solucao: se colocar o \n antes do %c do scanf, resolve o problema scanf("\n%c", chute);

Aguem sabe explicar o pq desse comportamento?

Olá Marcelo! Tudo bem?

Desculpe pela demora em obter retorno.

A execução dessa forma está relacionada ao buffer de entrada do terminal. Ao digitar um caractere e pressionar "Enter", o buffer entende que você digitou dois caracteres: o caractere que você digitou e o caractere de nova linha ('\n') gerado pela tecla "Enter".

Quando você usa scanf("%c", &chute);, ele lê o primeiro caractere presente no buffer, que é o que você digitou. No entanto, o caractere de nova linha ('\n') permanece no buffer. Então, na próxima iteração do loop, o scanf("%c", &chute); é executado novamente, e desta vez ele lê o caractere de nova linha ('\n') no lugar de ler o caractere que você realmente digitou. Isso faz com que a impressão do resultado pareça estar atrasada, pois o caractere de nova linha é lido na próxima iteração.

Quando você altera o scanf("%c", &chute); para scanf("\n%c", &chute);, você está pedindo explicitamente ao scanf para ler e descartar quaisquer caracteres de nova linha pendentes no buffer antes de ler o próximo caractere que você digitou. Dessa forma, o caractere correto é lido e o comportamento indesejado é corrigido.

Uma outra forma que podemos utilizar para contornar esse problema é modificar o scanf("%c", &chute); para scanf(" %c", &chute); (observe o espaço antes de "%c"). O espaço antes do "%c" indica que o scanf deve ignorar quaisquer espaços em branco ou caracteres de nova linha pendentes no buffer antes de ler o próximo caractere digitado.

Espero ter ajudado! Abraços e bons estudos!