Programação Progressiva

Fórum para dúvidas dos sites: Programação Progressiva, Java Progressivo, C Progressivo


Você não está conectado. Conecte-se ou registre-se

Problemas com WHILE

Ver o tópico anterior Ver o tópico seguinte Ir em baixo  Mensagem [Página 1 de 1]

1 Problemas com WHILE em Qui Maio 21, 2015 11:12 pm

Dentro da estrutura do código abaixo, se for digitado qualquer valor que não seja numeral entro em um LOOP INFINITO. Qual a explicação técnica para isso?

#include <stdio.h>
void main() {
int a = 0;
while(1) {
printf("Digite 9 \n");
scanf("%i", &a);
if (a == (int)9.0) {
break;
}
}
}

Ver perfil do usuário

2 Re: Problemas com WHILE em Sex Maio 22, 2015 4:58 pm

Bom, talvez seja por causa do caractere new line no buffer do teclado, ou pelos tipos
de dados diferentes mesmo... Sei lá, eu não tenho muitos conhecimentos técnicos sobre
a linguagem, é o que eu acho.

Mas se você colocar, em baixo do scanf, um outro scanf com o operador de supressão "*",
resolve esse problema. Ex:
Código:
scanf("%i", &a); // lê um número
scanf("%*c"); // suprime um caractere - o new line provavelmente

Ver perfil do usuário

3 Re: Problemas com WHILE em Sab Maio 23, 2015 1:20 pm

Abner,

Então acho que podemos eliminar a questão da TIPAGEM DE DADOS, pois alterei meu código conforme abaixo e o problema persiste:

Código:
#include <stdio.h>
void main() {
int a = 0;   
while(1) {
   printf("Digite 9 \n");
   scanf("%d", &a);
   //scanf("%*c"); // suprime um caractere - o new line provavelmente
      if (a == 9) {
         break;
      }
   }
}

Utilizando o operador de supressão resolve, esse operador é novo pra mim. Gostaria de entender tecnicamente como ele funciona e porque resolve o meu problema? Ele elimina o ENTER que se dá após informar o valor?

Ver perfil do usuário

4 É isso em Sab Maio 23, 2015 7:04 pm

Então, vcj81, essa é a idéia, esse operador serve pra você suprimir, descartar, algo que você não queira ler na scanf.
Ex:
Código:
printf("Digite tres nomes separados por espaco: ");
scanf("%s%*s%s", nome1, nome2);
Aí se você digitar, por exemplo, Carlos Bruno Camila, o Carlos vai parar no nome1, a Camila
no nome2, e o Bruno será descartado.

Outro exemplo:
Código:
printf("Digite seu primeiro nome: ");
scanf("%*c%s%*c", nome);
O primeiro caractere do que você digitar será suprimido, e o último também - que sempre
é o "\n" (new line). Acho que já deu pra sacar a lógica da coisa, né?
É possível usá-lo com números também, é claro.

É isso.  Very Happy

Obs: esse seu problema também se resolveria usando fflush(stdin) pra limpar o buffer
de entrada do teclado, mas, nas minhas pesquisas pela web, eu li muito que isso
não é recomendado, então, eu, particularmente, não uso.

Ver perfil do usuário

5 Re: Problemas com WHILE em Dom Maio 24, 2015 10:07 pm

Certo compreendi o comando . Mais porque com o provável motivo do NEWLINE meu código entra em Loop Infinito ???

Ver perfil do usuário

6 Re: Problemas com WHILE em Seg Maio 25, 2015 11:10 pm


Então, eu analisei melhor, acho que tem a ver sim com a tipagem de dados.

Vamos lá: você coloca "scanf("%i")", que é pra números, mas aí você digita
um caractere, o scanf não captura esse caractere - porque não é o esperado - então esse caractere continua no buffer de entrada do teclado, junto com o new line; ou seja, na próxima passagem pelo laço, o scanf vai "pensar" que você digitou a mesma coisa (porque está lá no buffer: caractere mais enter) e assim por diante: loop infinito.

Bom, eu acho que é isso... na verdade é a única lógica que eu consegui enxergar nesse caso.

Ver perfil do usuário

Conteúdo patrocinado


Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo  Mensagem [Página 1 de 1]

Permissão deste fórum:
Você não pode responder aos tópicos neste fórum