Problemas com SCANF, GETS e GETCH


Quando você utiliza, em um mesmo programa C. a função scanf, junto com as funções gets ou getch, encontra alguns problemas com a aparente "não execução" de uma ou mais das chamadas destas funções.

Dependendo do sistema operacional que voces está usando, haverá uma solução diferente para o problema.

Para o caso do ambientes DOS, usando o TCLite ou o BorlandC, basta acrescentar, após o uso da scanf,  uma chamada à função fflush, na seguinte maneira:
 

void main()
{
..........
.........
........
.........
            scanf(sdtin);
            fflush(stdin);
.......
.........
........
.........

            scanf(sdtin);
            fflush(stdin);
.......
.......

}

Se voce estiver usando um ambiente UNIX/LINUX, você deve chamar, após o uso da função scanf, a função flush_in descrita abaixo.
#include <stdio.h>
// ******************************************

// ******************************************
// Nome: void flush_in
// Descrição: Função que "limpa" o teclado
// evitando problemas com a leitura de dados
// do tipo CHAR.
// Código baseado em exemplo de
// Marco Aurélio Stelmar Netto
// stelmar@pinus.cpad.pucrs.br
// ******************************************
void flush_in()
{
   int ch;

   while( (ch = fgetc(stdin)) != EOF && ch != '\n' ){}
}

// ******************************************
//            Programa principal
void main()
{
   int i=0;
   char op;

   i = 1;  // inicializa o contador
   while(i <= 3) // repete 3 vezes
   {
      printf("\nDigite o Dado %d:",i);
      scanf("%c",&op);   // Le
      flush_in();   // Limpa o teclado
      printf("Dado Lido: %c\n", op);
      i++;  // passa ao próximo
   }

}


Clique aqui para fazer download do arquivo-fonte deste programa.