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

Resolvendo problemas de buffer


bruce845

Pergunta

Bem, muitos não sabem, mas em C, o buffer pode ser lido de maneira incorreta ao ler-se dados de diferentes tipos.

Ex.:

int numero;
char letra;
scanf("%d",numero);
scanf("%c",letra); // Ele irá iginorar esse scanf() caso seja lido desse jeito.
Para resolver o problema do buffer (ignora ler um dado), use o comando fflush(stdin) para limpar o buffer. Esse comando é muito usado em arquivos, mas nessa ocasião tem uma função especial. Toda vez que for ler um tipo de dado diferente (int com char, string com float, etc.) use o fflush(stdin).
int numero;
char letra;
scanf("%d",numero);
fflush(stdin);
scanf("%c",letra);
Dados que podem ser lidos juntos: int, float e double; char e string; Nunca leia um int, float ou double depois de um char, string ou vice-versa sem limpar o buffer antes. Agora executem esse programa com o define LIMPABUFFER com o valor de 0 e depois com o valor de 1 para ver a diferença:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define LIMPABUFFER 1 // Troque por 0 para desativar a limpeza do buffer.

int main(int argc, char **argv)
{
  int numero;
  char letra,palavra[20];
  puts("Digite o numero:");
  scanf("%d",&numero);
  system("CLS"); /* Limpa a tela. */
  #if LIMPABUFFER==1
  fflush(stdin);
  #endif
  puts("Digite a palavra:");
  gets(palavra);
  system("CLS"); /* Limpa a tela. */
  #if LIMPABUFFER==1
  fflush(stdin);
  #endif
  puts("Digite a letra:");
  scanf("%c",&letra);
  system("CLS"); /* Limpa a tela. */
  printf("O numero e: %d\n",numero);
  printf("A palavra e: %s\n",palavra);
  printf("A letra e: %c\n",letra);
  getch(); /* Inclua a biblioteca conio.h para usar esse comando! */
  return 0;
}

Postem o que acharam...

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

2 respostass a esta questão

Posts Recomendados

  • 0

Quando comecei a aprender um pouco de C, aquele 'salto' que ocorria durante os 'scanf's sempre me deixava na dúvida. Só depois, quando fui ler sobre os streams de E/S e buffers, passei a entender isto.

Link para o comentário
Compartilhar em outros sites

  • 0

Pelo amor fflush não pqp, até hoje não aprenderam que o fflush pode dar problema com o buffer de entrada, os próprios programadores da função fflush, disseram que não sabem o que pode acontecer quando você usa essa função para o buffer de entrada, a função fflush foi feita para buffer de saída !!!!! :!:

A melhor forma de se limpar o buffer realmente é simplesmente esta:

while (getchar() != '\n');//Pegando todos caracteres do buffer, chegando no '\n'(enter) ele descarta o '\n' e sai do loop

Pronto, se você colocar isso em baixo de cada scanf já vai ser muito mais saudável.

Para ficar mais legal ainda, pode-se usar isto:

#define LimparBuffer while(getchar()!='\n');

scanf("%d", &var);
LimparBuffer;

Mas para não precisar do while você pode fazer também:

scanf("%d%*c", &var);

Isso vai ler o numero inteiro e descartar o '\n'(enter) do buffer de uma vez. Para quem não souber o operador * no scanf faz ignorar o tal tipo de dado, no caso por exemplo se o usuário digita 10 e depois aperta enter ele vai guardar o 10 na var e descartar o '\n' deixando o buffer limpo. (O enter é um caractere).

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

  • 0

Para adicionar uma forma mais, a ver si advinham porque esse sistema funciona XDDD

#include <stdio.h>

int main (){
    
    char c1;
    char c2;
    
    printf("escreva uma letra e aperte enter: ");
    scanf("%c", &c1);
    printf("escreva outra letra e aperte enter: ");
    scanf(" %c", &c2);    
    
    printf("C1: %c\n", c1);
    printf("C2: %c", c2);    
    
    getchar();
    return 0;
}
Editado por vangodp
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
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...