problema com loop

problema com loop

por Pedro Musa -
Número de respostas: 4
To com um problema muito estranho, parace q ele executa o loop 2 vezes antes de parar no scanf novamente. Ele entra no loop para no scanf, ai digito sei lá h
> h (ta no scanf e digito h)
default (imprime msg do default)
> defalt (imprime o > pula o scanf imprime o default)
> (aqui imprime > e para no scanf)
do{
printf("> ");
scanf("%c",&c);
switch (c){
  case 'n': printf("n\n");
  break;
 case 'r':
  printf("r\n");
  break;
 case 'm':
  printf("m\n");
  break;
 case 'e':
  printf("e\n");
  break;
 case '?':
  printf("?\n");
  break;
 default:
  printf("defaul\n");
  break;
 }
}while(c!='q' && c!='f' && c!='x');
Em resposta à Pedro Musa

Re: problema com loop

por João Francisco Amorim Enomoto -
Provavelmente o caractere de quebra de linha ('\n') está sendo empilhado na pilha de scanf's e faz com que o seu programa receba duas entradas: o caractere digitado e o '\n'. O scanf coloca todas as entradas do programa em uma espécie de fila e vai os pegando conforme é chamado. Quando você digita h<aperta enter>, ele considera o caractere h e empilha o '\n' junto. Para evitar isso, tente fazer scanf("%c ", &caractere); ou scanf(" %c", &caractere); que seu programa irá pular as quebras de linhas sem problema.

Só uma curiosidade: se quiserem entender o que eu disse acima, tentem criar uma série de comandos para o programa de vocês, copiem esses comandos e colem no programa de vocês (assim que estuver tudo ok). Se nada der errado, ele vai executar todas as instruções exatamente na ordem em que foi passada na colagem. Em Linux dá para fazer algumas brincadeiras com arquivos de texto, repassando o conteúdo desse arquivo integralmente para o programa (não manjo muito bem disso, mas acredito que seja "./ep3 < cat instrucoes.txt"). Taí uma boa maneira de vocês padronizarem os testes de vocês e descobrir como um monitor corrige os EPs =P

Abraços!
Em resposta à João Francisco Amorim Enomoto

Re: problema com loop

por Pedro Musa -
bom a parte do pau com o enter funcionou mas na parte de digitar o nome do conjunto eu fiz como o exemplo do prof no posfixa.
i=-1;
do{
   i++;
   scanf("%c", &nome[i]);
}while(i<10 && nome[i] != '\n');
se digito a mais ele fica só com os 10 primeiros mas usa o resto como comando no programa
se digito a menos ele fica esperando mais como se a checagem != '\n' não funcionasse. tente " %c" , "%c " e " %c " e nada.