Qual é a melhor maneira de limpar o buffer ? [RESOLVIDO]

1. Qual é a melhor maneira de limpar o buffer ? [RESOLVIDO]

Ednux
ednux

(usa Arch Linux)

Enviado em 23/08/2014 - 19:35h

Qual é a melhor maneira ou mais correta de se limpar o buffer ?
tipo quando se usa getchar() mais de uma vez. Se não limpar o buffer o 'c' puxa automaticamente o char anterior ou o enter, para isso é necessário limpar com f__purge ou fflush. Mas como seria o correto ?


  


2. MELHOR RESPOSTA

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 23/08/2014 - 19:39h

Cara , eu acho que essa eh a melhor maneira e funciona em qlq sistema operacional

Faça algo parecido com isso :


#include <stdio.h>

void limparBuffer(void){

char c;
while((c = getchar()) != '\n' && c != EOF);

}

int main(){

int a,b,c;

a = getchar();
limparBuffer();

b = getchar();
limparBuffer();

c = getchar();
limparBuffer();

printf("%i\n%i\n%i\n",a,b,c);

return 0;
}


Espero que tenha ajudado.

T+

3. Re: Qual é a melhor maneira de limpar o buffer ? [RESOLVIDO]

Ednux
ednux

(usa Arch Linux)

Enviado em 23/08/2014 - 19:43h

Valeu Thihup, agora meu programa tá funcionando.


4. Re: Qual é a melhor maneira de limpar o buffer ? [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 25/08/2014 - 21:10h

Tenho uma observação sobre o código marcado como "melhor resposta", pois ele está errado.

void limparBuffer(void){

char c;
while((c = getchar()) != '\n' && c != EOF);

}


A função getchar() devolve um valor do tipo int, não do tipo char. Um dos motivos para que seja assim é justamente a sinalização de erros.

A documentação da função fgetc(), que é o motor por trás de getchar(), diz o seguinte (em tradução livre e comentada):

fgetc() lê o próximo caráter do fluxo [de entrada] e o retorna como um unsigned char convertido [expandido] para int, ou EOF [cujo valor é -1] ao final do arquivo ou em erro.


Por motivos históricos, o tipo char não armazena apenas caracteres, mas também inteiros representáveis com um único byte. Esses inteiros tipicamente têm oito bits e podem ser com sinal (signed char, variando de -128 a 127) ou sem sinal (unsigned char, variando de 0 a 255). Quando não se especifica nem signed nem unsigned, o comportamento default depende da arquitetura, mas nossos PCs trabalham com bytes com sinal.

Se você tentar atribuir o valor de retorno de fgetc() ou getchar() a uma variável com largura de apenas um byte com sinal, estará tornando indistinguível o EOF do byte ou caráter que tem todos os bits iguais a 1 (por exemplo, o caráter 'ÿ' no conjunto de caracteres ISO-8859-1 ou Windows CP1252). Se o atribuir a um byte sem sinal, o EOF vai ser truncado para caber em oito bits, e vai se tornar o byte sem sinal com valor 255. No primeiro caso, o loop acima pode parar antes da hora, se encontrar um byte válido, mas que se confunde com EOF ao comparar o byte -1 (ou o caráter 'ÿ') com o inteiro -1. No segundo, o loop pode nunca terminar por chegar ao fim do arquivo, pois 255 não vai ser igual nem a '\n' (10) nem EOF (-1).

A forma correta seria declarar c como int.


5. Re: Qual é a melhor maneira de limpar o buffer ? [RESOLVIDO]

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 25/08/2014 - 21:16h

https://www.youtube.com/watch?v=W-X2_v4Oyx8


Desculpe cara , eu nao sou um deus de programação em C , mas eu sempre usei isso e deu certo

Desculpe cara . nao foi minha intenção

T+


6. Re: Qual é a melhor maneira de limpar o buffer ? [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 26/08/2014 - 09:14h

A questão não é se desculpar nem, muito menos, ser ou não ser um "deus". A correção que eu postei é para que todos aqui -- seja você, o autor da pergunta original ou quem quer que venha a ler este tópico -- conheçam a forma certa de fazer e o porquê de ser assim.

Quando tinha menos experiência, eu mesmo cansei de cometer erros desse tipo -- inclusive esse próprio -- por conta de falta de orientação ou orientação errônea. O que eu procuro fazer neste fórum é compartilhar o que eu aprendi com o tempo -- às vezes a dura penas -- para que o caminho de vocês possa ser mais breve e menos tortuoso.

Em tempo: há muitos temas discutidos neste fórum sobre os quais eu não sei nem mesmo o básico para poder entender o problema. Não tenho nenhuma pretensão de infalibilidade ou onisciência.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts