• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Ziwdon

[Resolvido] Key Input & System("PAUSE")

12 mensagens neste tópico

Boas

Preciso de ajuda. Estou a tentar criar uma função que faça o mesmo no Linux que o "system("pause")" faz no windows.

Em principio seria simples mas não estou a conseguir.

O que eu queria era que aparecesse uma mensagem a dizer para o utilizador pressionar uma tecla e/ou o ENTER para continuar.

O que estava a fazer era ler o caracter introduzido e depois executar determinada acção mas o programa fica marado.

Tenho algo deste género:

//no caso de uma tecla qualquer
Printf("Prima uma tecla para continuar...");
char key;
scanf(" %c", &key);
if ((int)key>-1 && (int)key<128)
   //EXECUTA CÓDIGO;

//no caso do ENTER
Printf("Prima ENTER para continuar...");
char key;
scanf(" %c", &key);
if ((int)key==13)
   //EXECUTA CÓDIGO;

Em ambos os casos, o programa fica marado e começa a correr o menu incial sem parar (nao sei porque carga de água, se nem faço referência ao menu na função).

No segundo caso...se usar por exemplo "(int)key== 49" (1) já resulta. Com o ENTER ele não recebe caracter nenhum.

Já agora...eu vejo-me obrigado a usar "scanf" porque não consigo usar o "getchar"...alguém sabe porque? Eu tenho la o "stdio.h" mas simplesmente não acontece nada com o "getchar"...era como se ignorasse.

Agradeço a vossa ajuda

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A variáveis convém declará-las antes mas neste caso nem é preciso isto.

faz o seguinte:

printf("Prima ENTER p continuar...");
getchar();

Também podes usar o getch em vez do getchar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hipnoted obrigado por responderes.

Eu já tentei fazer isso mas como disse o getchar nao funciona...e nao sei porque  :wallbash:. Simplesmente ignora o getchar e passa logo ao código seguinte.

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Experimenta fazer um fflush(stdin) antes do getchar().

Isso limpa o buffer do teclado certo? Mesmo assim...nada :wallbash:

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Epá testei agora o código no Windows e funciona perfeitamente.

No Linux nada... :rant_01: ai maezinha...

Vou fazer uma googlada a ver se encontro alguma coisa sobre o assunto.

Cumps

p.s. desculpem o double post.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok...problema resolvido. Aqui está a solução:

printf("Prima uma tecla para continuar...");
getchar();
getchar();

Pelo que percebi, o "fflush(stdin)" apenas limpa o output buffer. Assim, como eu anteriormente digito o nome de um ficheiro e carrego ENTER, o ENTER fica no input buffer. Assim, o primeiro getchar() "apanha" esse ENTER e limpa o buffer.

Contudo, se correr o código no windows, já tenho que carregar duas vezes numa tecla.

Vejam aqui...LINK.

Obrigado a todos pela ajuda.

Cumps ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Epá testei agora o código no Windows e funciona perfeitamente.

No Linux nada... :rant_01: ai maezinha...

Olá.

Este código (é o que querias testar?) funciona perfeitamente em linux:

#include<stdio.h>

int
main (void)
{
printf("Prima uma tecla para continuar...");
getchar();
return 0;	
}

O fflush("stdin") não limpa o output e não deve ser usado. O fflush não está implementado para file streams de input (incluindo stdin), o que pode ter um comportamento errático quando usado desta forma. Num compilador até pode funcionar e ter este comportamento implementado mas noutros não, por isso não aconselho a fazeres fflush("stdin").

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Epá testei agora o código no Windows e funciona perfeitamente.

No Linux nada... :rant_01: ai maezinha...

Olá.

Este código (é o que querias testar?) funciona perfeitamente em linux:

#include<stdio.h>

int
main (void)
{
printf("Prima uma tecla para continuar...");
getchar();
return 0;	
}

O fflush("stdin") não limpa o output e não deve ser usado. O fflush não está implementado para file streams de input (incluindo stdin), o que pode ter um comportamento errático quando usado desta forma. Num compilador até pode funcionar e ter este comportamento implementado mas noutros não, por isso não aconselho a fazeres fflush("stdin").

Boas

O código funciona sim. O problema é que, como disse no post anterior, antes de executar esse código, eu peço ao utilizador para inserir uma string (através do scanf). O que acontece, é que ao carregar no ENTER para inserir a string, o ENTER fica no buffer do teclado, e quando faço "getchar()" ele vai buscar esse ENTER e não espera por uma tecla. Daí eu ter escrito "getchar()" duas vezes, uma para retirar o ENTER e o segundo já espera por uma tecla. Percebeste? Eu pelo menos foi isso que entendi. Vê o link que dei no post anterior.

Então e afinal qual é a função do "fflush()"?

Cumprimentos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

while(getchar() != '\n');

Este pequeno código limpa o buffer. Usem e abusem dele. ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora