Jump to content
David Rego

Leitura de caracteres

Recommended Posts

David Rego

Bom dia pessoal,

estou aqui com uns problemas básicos na leitura de caracteres devido ao buffer.

Como faço para meter o seguinte programa a correr sem o buffer me "comer" informação?

void desenha(int a,int b)
{
int i,j;
for(i=0;i<a;i++)
{
	for(j=0;j<b;j++)
	{
		printf("-");
	}
	printf("\n");
}
}

void main()
{
char nlin[1],ncol[1];
int lin,col;

printf("Jogo do quadrado\n\n");
do{
printf("Introduza o numero de linhas:");
scanf("\n%c", &nlin);
lin=atoi(nlin);
}while(lin<=0 || lin>8);
fflush(stdin);
do{
printf("Introduza o numero de colunas:");
scanf("\n%c",&ncol);
col=atoi(ncol);
}while(col<=0 || col>15);

desenha(lin,col);
}

Toda a ajuda é bem-vinda :)

Share this post


Link to post
Share on other sites
Xpirito

Boas

eu costumo fazer (embora não seja o mais adequado) leio do teclado e mando para uma variável que não vou usar nunca.

fflush em streams de entrada (fflush(stdin)) é um erro. A função fflush, de acordo com o padrão C, não está definida para streams de entrada, apenas para streams de saída. Usar fflush em streams que não sejam de saída gera comportamento indefinido.


Para perguntas idiotas, respostas estúpidas!

Share this post


Link to post
Share on other sites
David Rego

Boas

eu costumo fazer (embora não seja o mais adequado) leio do teclado e mando para uma variável que não vou usar nunca.

fflush em streams de entrada (fflush(stdin)) é um erro. A função fflush, de acordo com o padrão C, não está definida para streams de entrada, apenas para streams de saída. Usar fflush em streams que não sejam de saída gera comportamento indefinido.

então sendo assim que alterações no código é que tenho que fazer para além de tirar o fflush?

Share this post


Link to post
Share on other sites
brunoais

Tenta:

int c;

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

Fonte:

http://stackoverflow.com/questions/2187474/i-am-not-able-to-flush-stdin

Já agora aproveita e arranja essa indentação. Está horrível para se ler!!!


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
brunoais

Já experimentei isso e não resultou...

O que é que aconteceu que não devia acontecer?

O que é que não aconteceu que devia acontecer?

Em que sistema operativo estás a programar (deve ser system indepedent mas mesmo assim...)?


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
Xpirito

Eu peguei no teu código e testei-o. encontrei algumas coisas que não sei para que servem. Para que é isto?

char nlin[1],ncol[1];

E reescrevi parte ( pouca) do teu código e ficou a funcionar. Experimenta este código assim e se tiveres dúvidas, diz :)

#include <cstdlib>
#include <iostream>
void desenha(int a,int b)
{
   int i,j;
       for(i=0;i<a;i++)
       {
          for(j=0;j<b;j++)
           {
              printf("-");
             }
             printf("\n");
        }
}
void main()
{
   int lin,col;

       printf("Jogo do quadrado\n\n");
       do
         {
            printf("Introduza o numero de linhas:");
            scanf("\n%d", &lin);
          }
       while(lin<=0 && lin>8);

       do
         {
            printf("Introduza o numero de colunas:");
            scanf("\n%d",&col);
         }
        while(col<=0 && col>15);
       desenha(lin,col);
}


Para perguntas idiotas, respostas estúpidas!

Share this post


Link to post
Share on other sites
David Rego

Pois, isso funciona muito bem até introduzir um caracter que fará o programa crashar...

A ideia é pedir números mas fazendo com que o programa continue a pedir mesmo que o utilizador introduza uma letra por engano. Mais tarde isto servirá para acrescentar num trabalho...

Share this post


Link to post
Share on other sites
Submit_RnM

Usa a função "isdigit" da biblioteca "ctype.h".

A funçao devolve 0 se o caracter não for numérico e devolve 1 se for.

exemplo

char c;
scanf( "%c", &c );
if( isdigit(c) )
printf( "You entered the digit %c\n", c );

cumps

Share this post


Link to post
Share on other sites
aladino77

A funcão setvbuf da biblioteca stdio controla o buffering dos streams.

[pre]

      int setvbuf(FILE *stream, char *buf, int mode , size_t size);

[/pre]

Neste caso pretende desactivar o buffering no stdin. Pode faze-lo activando o modo _IONBF (unbuffered)

[pre]

      setvbuf(stdin, NULL, _IONBF, 0);

[/pre]

Chame essa função antes de comecar a leitura.

Share this post


Link to post
Share on other sites
tsrodrigues

Boas tardes,

É assim, pelo que percebi tu queres simplesmente fazer um programa que na parte onde inseres os dados ele continue a pedir valores quando o valor inserido não corresponde a um valor válido. Ou seja, quando pedes um número se o utilizador inserir um número o programa continua normalmente, se inserir outra coisa qualquer, tipo uma letra, ele volta a pedir um número.

Se tiver percebido bem a tua questão e se for essa a solução é bastante simples e não necessita de nenhum include para além do tradicional #include<stdio.h>

Existem vários factores que nos passam despercebidos e que por vezes nos dão imenso jeito. Neste teu programa basta criares uma variável teste do tipo inteiro e quando chamas a função scanf() mandas o return da função para essa variável: teste = scanf(" %d", &lin); depois metes o printf("Introduza o numero de linhas:") e o teste = scanf(" %d", &lin); dentro de um ciclo (while por exemplo) em que enquanto o valor de teste não for igual a 1 ele está sempre a pedir um valor.

EXPLICAÇÃO, A função scanf retorna 0 se não conseguir ler o que é pedido ou o numero de valores que conseguiu ler, ou seja, se estás a querer ler dois inteiros e metes um inteiro e uma letra a funçao devolve 1 porque só conseguiu ler um inteiro e nao dois. No teu caso se ler um inteiro devolve 1, se ler outra coisa qualquer devolve 0.

Cumps

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

×
×
  • 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.