Limpar buffer de teclado em C com __ffpurge(stdin);

PDF versionSend to friendSend to friendVersão para impressãoVersão para impressão

Após criar uma função secundária no C que é chamada através de um switch, comecei a ter problemas no momento de pegar a string através do teclado, pois ao tentar ler o que o usuário digita-se e armazená-la numa string o programa "quebrava" e passava para o segundo momento onde eu estava tentando pegar uma segunda string.

Para resolver este problema foi utilizada a função __fpurge() para limpar o buffer do teclado, lembrando-se que esta função está dentro do .

O único problema da função __fpurge() é que funciona _somente_ no GNU/Linux portanto não irá preservar um dos propósitos do C que é uma linguagem multi-plataforma, portando pense muito bem antes de utilizar esta função em seu programa.

Uma sujestão é que pode ser utilizada uma função que verifica qual é o s.o. em que está rodando o programa para saber qual função poderá ser utilizada para limpar o buffer do teclado.

Ex.:

#include <stdio.h>
#include <stdlib_ext.h>

int questao03() {
system("clear");
__fpurge(stdin); // Aqui é limpado o buffer do teclado (stdin - entrada padrão)
char string1[69], string2[69], aux[69];
printf("Digite seu nome: ");
fgets(string1,69,stdin);
printf("\nDigite seu sobrenome: ");
fgets(string2,69,stdin);
strcpy(aux,string2); //copia string2 para aux
strcpy(string2,string1); //copia string1 para string2
strcpy(string1,aux); //copia aux(string2) para string1
printf("Na agenda telefonica seu nome aparecerá assim: %s, %s",string1,string2);
return 0;
}

int main() {
int questao;
system("clear");
printf("\t===> Lista de Exercícios sobre Funções <==\n");
//[...]
printf("Questão 03. Trocar strings");
//[...]
printf("\nDigite o número da questão que gostaria de chamar: (9 para sair) ");
scanf("%d",&questao);
switch(questao) {
//case 1 : questao01(); break;
//case 2 : questao02(); break;
case 3 : questao03(); break;
//case 4 : questao04(); break;
//case 5 : questao05(); break;
//case 6 : questao06(); break;
//case 7 : questao07(); break;
case 9 : printf("\n\nO programa está sendo encerrado.\n");
printf("Pressione Enter para fechar!"); break;
default : printf("Questão inválida!");
}
return 0;
}