Ir para conteúdo
Fórum Script Brasil
  • 0

Erro em código C


Palladium

Pergunta

Pessoal, estou começando agora, e me encontro com o seguinte problema:

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

int main()
{
    int fim = 0;
    char letra;
        do
        {
            printf("Letra: \n");
            scanf("%c", &letra);
        }while(fim != 1);
    return 0;
}
 

Dentro da lógica, o loop infinito que criei faria com que a tela imprimisse: "Letra: " e em seguida escaneava, e assim sucessivamente. Porém ele imprime "Letra: " e escaneia na primeira passagem do loop, na segunda ele imprime a string "Letra: " o numero de vezes em que eu escrevi 1 letra.
Testem o código e saberão do que falo!

Espero que me ajudem, estou tentando criar um jogo que lida com strings, mas esse erro me travou completamente, lembrando que uso Code Blocks, já testei no Dev C++ e os dois apresentam o mesmo erro, e o compilador que uso é o GNU GCC 4.9.2, valeu!

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

De forma resumida, o problema parece estar acontecendo por causa de um problema ( componente ) chamado " Buffer do Teclado ", simplesmente ele tem a função de armazenar todos os caracteres de entrada do teclado, porem, em algumas situações funções como ( scanf ) não eliminam o ultimo caractere inserido normalmente Nova Linha ( \n ), normalmente associado ao presionar a tecla ENTER para finalizar a entrada de dados.

Isso faz com que da proxima vez em que o Loop iniciar e tentar ler algo do teclado, ele simplesmente irá verificar que já existe um caractere no Buffer e se o mesmo for o ( \n ), a função ( scanf ) finalizará a entrada de dados causando o problema que você está tendo!

Uma das formas de se resolver o problema é utilizando alguma função que faça a limpeza do Buffer do Teclado, logo apos alguma entrada:

- No Linux existe a função __fpurge ( stdin );

- No Windows existe a função fflush ( stdin );

Apenas observando que a função fflush ( stdin ) não foi criada especificamente para este proposito, sendo que seu uso está associado a varios problemas que são causados por um comportamente indefinido da função, então lhe aconselho a não utiliza-la!

- algo que você tambem pode fazer é utilizar a função getchar(); apos cada entrada do teclado.

- Se não me engano tambem existe a possibilidade de se realizar a Limpeza do Buffer com algum caractere de escape definido pela propria função ( scanf ) só não me lembro qual . . .

 

Por hora é só . . . tente buscar informações sobre a Limpeza do Buffer do Teclado e ver qual metodo é o mais indicado para o seu problema!

Editado por Felipe222
Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado por ter respondido, o problema acontece na função main, a partir da linha 46. Se quiser ver e entender o que quero dizer.. Quero fazer um Jogo Da Forca.

 

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

struct dicionario
{
    char palavra[20];
};

int main()
{
    void clear(void);
    void mapeamentoJogo(int tamanhoDaPalavra);
    int mapeamento();
    int menu(void);
    int tamanho(struct dicionario key[], int num);

    struct dicionario chave[3] = {{"pais"},{"cor-de-laranja"},{"joao e maria"}};

    char letra, escrita[20] = "\0", certo[20] = "\0";
    int fim = 0, s = 0, numeroChances = 16, h = 0;
    int opcao, numPalavra, tam, i, j, soma = 0;
    
        opcao = menu();
            if(opcao == 1)
            {
                numPalavra = mapeamento();
                tam = tamanho(chave, numPalavra);
                clear();
                for(i = 0; i < tam; ++i)
                {
                    if(chave[numPalavra].palavra == ' ')
                    {
                        escrita = ' ';
                        continue;
                    }
                    if(chave[numPalavra].palavra == '-')
                    {
                        escrita = '-';
                        continue;
                    }
                    escrita = '_';
                }
                fim = tam+1;
                soma = -2;
                dog
                {    
                    letra = '\0';
                    printf("\n\n\nLetra: ");
                    letra = getch();
                    printf("\t\t");
    
                    for(i = 0; i < tam; ++i)
                    {
                        if(letra == chave[numPalavra].palavra)
                        {
                            escrita = letra;
                        }
                        
                        printf("%c", escrita);
                        
                        if(escrita == chave[numPalavra].palavra)
                        {
                            ++soma;
                        }
                        
                        if(soma == tam)
                        {
                            clear();
                            printf("Ganhou!");
                            getch();
                            fim = 1;
                        }
                    }
                }while(fim != 1);
            }
    
            else
            {
                clear();
                printf("\t\t\t    Voce saiu!\n\t\tPressione qualquer tecla para sair!");
                getch();
            }
        clear();
    return 0;
}

void clear(void)
{
    system("cls");
}

int menu(void)
{
    int num;

    printf("\t\tJogo Da Forca - Desenvolvido por Palladium\n\n");
    printf("1.Jogar\n0.Sair\n\nOpcao: ");
    scanf("%i", &num);
    clear();

    return num;
}

int mapeamento(void)
{
    int num;

    do
    {
    printf("\t\n\nEscolha uma palavra: ( 1 a 3 )\t\n\nOpcao -> ");
    scanf("%i", &num);
    --num;
    clear();
    }while(num < 0 || num > 2);

    return num;
}

int tamanho(struct dicionario key[], int num)
{
    int i = 0, c = 0;

    while(key[num].palavra != '\0')
    {
        if(key[num].palavra != '\0')
        {
            ++c;
        }
        ++i;
    }
    return c;
}
 

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...