Ir ao conteúdo
  • Cadastre-se

C Como limpar buffer do teclado no DEVC++?


DarkLaw

Posts recomendados

Olá pessoal estou usando o DEVC++ e me deparei com a seguinte situação no meu código.

 

#include <stdio.h>
#include <stdlib.h>
main()
{
char nome[50];

printf("Digite seu nome: "); scanf("%[^\n]s",nome);

}

 

Até ai tudo bem, só que quando eu fui incrementando mais funções no meu código, mais pra frente na hora de rodar ele no prompt ele deu erro, pesquisei sobre e vi que o problema era de buffer do teclado, a solução era fácil eu precisava apenas dar um espaço entre " e % no scanf do código mostrado acima, entretanto gostaria de saber se tem outro jeito de limpar o buffer, e se esse erro de buffer só está acontecendo porque eu coloquei uma função para ler a string com espaços.

 

Desde já agradeço galera :)

Link para o comentário
Compartilhar em outros sites

Olá, tudo bem?

 

 

Então, essa solução que você menciona para resto em buffer só é válida quando trata de caracteres não gráficos (de espeço em branco) todo o resto persistirá. Para esse situação em particular, naturalmente scanf sempre vai deixar '\n' para traz. Basta escrever um getchar () logo depois para pegá-lo.

scanf ("%[^\n]", nome);  getchar ();  /* ENTER( '\n' ) */

 

 

Como getchar pega um a um dos caracteres. A maneira mais geral de resolver é ler tudo que se encontra no stdin até o fim do arquivo - EOF. Para todos as situações. purgar_stdin: limpará o buffer padrão de entrada do programa.

void purgar_stdin (void) {
  
      for (char ch =  getchar (); 
                  (ch  !=  '\n') && (ch  !=  EOF);
                        ch =  getchar ()) {}
      
      return  ; }

 

 

O.K !? Tchau.

 

  • Amei 1
Link para o comentário
Compartilhar em outros sites

@Waldir.M Olá. Tem sim. Vou passar duas funções próprias para isso:

void limpa_linha() {
    scanf("%*[^\n]");
    scanf("%*c");
}
void fflush_stdin() {
    char ch;
    while ((ch = getchar()) != '\n' && ch != EOF);
}

Para usar essas funções seria dessa forma:

printf("Digite seu nome: ");
scanf("%[^\n]",nome);
limpa_linha();       // ou fflush_stdin();

É só chamar a função q gostar mais depois de cada scanf

adicionado 0 minutos depois

@AnsiC Ops.. Foi mais rápido rs...

Link para o comentário
Compartilhar em outros sites

@giu_d Obrigado amigo, não entendi o que você disse na primeira parte mas quando você demonstrou como eu posso usar efetivamente a função eu entendi, é que eu sou novo em programação então ainda me enrolo em algumas coisas mas de qualquer forma obrigado mesmo mano, se puder explicar de uma forma mais fácil o que você quis dizer com aquela parte de void e EOF ajudaria muito hehe...

adicionado 4 minutos depois

@AnsiC Fala ae mano, não entendi muito bem para o que serve a função getchar (); /* ENTER( '\n' ) */.

Tem como explicar de um jeito mais fácil kkk, desculpa ter que fazer explicar tudo novamente é que eu sou novo então ainda não entendo muito bem como algumas funções funcionam de fato...

Link para o comentário
Compartilhar em outros sites

@Waldir.M Olá. void é o tipo de retorno da função, ou seja, a função não retorna nada.

E quanto a macro EOF se refere a End Of File, ou fim de arquivo

Se você inda está começando e programar é normal surgir dúvidas mesmo, mas assim q você estudar sobre funções vai aprender sobre tipo de retorno de uma função, mas é como costumo dizer, é passo a passo, degrau por degrau

Explicar assim em algumas linhas sobre funções ficaria difícil hehe

Resumindo: Uma função tem o tipo de retorno void porque não retorna nada, que é o caso das duas funções que passei

 

Qualquer dúvida é só perguntar. Gosto quando a pessoa pergunta mesmo rs...  Isso demonstra que ela tem interesse em aprender :thumbsup:

Link para o comentário
Compartilhar em outros sites

11 horas atrás, Waldir.M disse:

getchar (); /* ENTER( '\n' ) */.

... Aqui a função é getchar (); a função captura um caractere, antes digitado no fluxo padrão de entrada do teclado -- stdin, e retorna-o para o bloco. Caso não exista nada no buffer do teclado, a função aguarda até que o ENTER seja pressionada para o começar a captura pelo primeiro caractere que ainda está no buffer (memória) do teclado. Se falhar na captura ou se o buffer atingir seu fim, a função retorna o padrão EOF.  

 

Ilustração:

int main (void)
      {
      int tecla =  0;

      printf ("Digite uma coisa do teclado, e somente depois disso tecle a ENTER\n");
      printf ("Digite a tecla 0 e depois disso a ENTER para finalizar.\n\n");
      while ((tecla =  getchar ())  !=  EOF)
            {
            printf ("O usuario digitou a [tecla]: %c\n", tecla);
            if (tecla  ==  '0')
                  {
                  printf ("O.k. Tchau!\n\n");
                  break;
                  }
            getchar (); /**< Esse ´getchar´ vai descartar o ENTER digitado */
            }

      return 0;
      }

O.k. !? Tchau.

  • Amei 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...