Jump to content
Sign in to follow this  
Gigaloja

Limpar buffer

Recommended Posts

Gigaloja

eu tou a fazer um programa que gere stock's em linguacem C. e tenho que ler uma string que e' o nº de serie de um componente com 6 caracteres e tenho que a seguir ler outra striing até 20 carcteres só que se eu meter 6 carctres no serie funciona direito se nao ocupa a memoria do nome e passa para outro passo.

Aki fica parte do meu codigo.

printf("Insira o num serie do componente: ");

scanf("%6s", busca_serie);

if(strlen(busca_serie)>6)

{    scanf("%*[^\n]%*c");

// eu quero que entre estes dois passos ele limpe o que está para alem dos 6 carcteres lidos.

printf("Insira o nome do componente(ate' 20 caract): ");

scanf("%20s", ins_name);

if(strlen(ins_name)>20)

{    scanf("%*s");      }

Share this post


Link to post
Share on other sites
bubulindo

para que fazes isto?

if(strlen(busca_serie)>6)

{    scanf("%*[^\n]%*c");

Se já fizeste um scanf, para que vais fazer outro, com condições diferentes sem uma variável para passar o valor lido?

Deves usar o scanf assim "scanf("%6s", &busca_serie);"

Porque não usar uma função que só leia 6 caracteres em vez de andares a limpar o vector?


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
Gigaloja

eu quero ler um numero alfanumerico de 6 carcteres, só que eu quero por para limpar o buffer se introduzirem mais do que 6 cacteres, para não mandar ocupar espaço na proxima leitura.

printf("Insira o num serie do componente: ");

scanf("%6s", busca_serie);

// eu trnho que limpar entre estes dois para nao mandar para o nome os restantes carcteres

printf("Insira o nome do componente(ate' 20 caract): ");

scanf("%20s", ins_name);

Share this post


Link to post
Share on other sites
Baderous

O código que tinhas antes para limpar o buffer funciona, mas sem os ifs porque senão estavas a testar se a string lida tinha 6 caracteres, quando na verdade apenas lias 6 caracteres (limite definido no scanf).

printf("Insira o numero de serie do componente: ");
scanf("%6s",busca_serie);
scanf("%*[^\n]%*c");
printf("Insira o nome do componente: ");
scanf("%20s",ins_name);

Share this post


Link to post
Share on other sites
tf_soares

Olá!

Se queres limpar o buffer podes fazer fflush(stdin).

Isso irá limpar o buffer.

Mas se queres ler só 6 caracteres, desaconselho-te o uso do scanf. Mas apenas por prática. Se quiseres ler uma string com espaços o scanf é para esquecer.

Para isso usa-se o gets. [ gets(string) ]

Se queres ler so X caracteres entao podes usar o fgets. [ fgets(string, X, stdin) ] -> 'stdin' porque esse é o ficheiro de entrada de dados, o falado buffer de entrada. Podia também ser um ficheiro que tenhas aberto.

Espero ter ajudado...

Share this post


Link to post
Share on other sites
Baderous

Só maus conselhos...

Se queres limpar o buffer podes fazer fflush(stdin).

Isso irá limpar o buffer.

O fflush apenas tem comportamento definido para buffers de saída de dados como o stdout e o stderr, e não para buffers de entrada como o stdin.

Mas se queres ler só 6 caracteres, desaconselho-te o uso do scanf. Mas apenas por prática. Se quiseres ler uma string com espaços o scanf é para esquecer.

Para isso usa-se o gets. [ gets(string) ]

O scanf, tal como eu o apresentei, permite ler apenas 6 caracteres, sem espinhas. Se tiver espaços, usa-se o seguinte formato:

scanf("%80[^\n]",str); ////lê no máximo 80 caracteres para uma string ou, caso o input seja menor que 80, lê até encontrar um '\n' que indica mudança de linha

A função gets não deve ser usada porque pode gerar problemas de buffer overflow, pois não tem qualquer noção do tamanho da string onde vai ser guardado o valor a ler. Está até previso que desapareça da próxima versão do standard do C.

O fgets pode ser usado como alternativa, mas não pelas justificações referidas.

Share this post


Link to post
Share on other sites
tf_soares

Respeito a tua opinião totalmente... E entendo-a... E tens razão...

Por acaso já sabia do perigo de buffer overflow. Apenas dei alternativas...

Mas não dei importância a alguns pormenores que tornam o programa falível a qualquer momento.

Só uma tenho uma dúvida... Acredito que o fflush não esteja preparado para limpar o stdin. Mas tenho-o usado já há bastante tempo e ele nunca deu problemas.

Share this post


Link to post
Share on other sites
Baderous

Só uma tenho uma dúvida... Acredito que o fflush não esteja preparado para limpar o stdin. Mas tenho-o usado já há bastante tempo e ele nunca deu problemas.

Até um dia. Eu acabei de trocar aquele scanf que indiquei ao user para limpar o buffer (que funciona) por um fflush(stdin) e o buffer não foi limpo. Tal como disse, o seu comportamento é indefinido para buffers de entrada. Quando usei o Dev-C++ que usava o MinGW como compilador, funcionava. Em Linux e Mac, com o GCC, não funciona.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.