paulo1205
(usa Ubuntu)
Enviado em 17/06/2016 - 01:53h
listeiro_037 escreveu:
É um comando chamado ReadKey.
Ele funcionou no Free Pascal que foi onde o utilizei quan do fiz um trabalho de criação de calculadora na matéria chamada estrutura de dados.
Então você está, sim, falando de uma função (não comando) de uma biblioteca específica (CRT, se não me engano). Tal biblioteca, embora muito comum em várias implementações de Pascal, não é (ou não era) parte da linguagem padrão. E essa função não faz a filtragem a que se referiu a pergunta original, mas tão-somente permite ler um caráter de cada vez do terminal, sem submetê-lo ao buffer de leituras feitas com
Read ou
ReadLn. A implementação do filtro será responsabilidade do programador.
Sendo desse jeito, pode-se ter coisa parecida também em implementações particulares do C, seja com Curses, ConIO, ou com as versões mostradas várias vezes aqui no fórum de
my_getch(), que chamam recursos do sistema operacional diretamente.
EDIT: Eu disse que uma implementação de
my_getch() foi mostrada várias vezes, mas no fim das contas só achei uma vez. Repito-a aqui para facilitar.
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
/*
Função que lê um caráter diretamente do terminal e
o retorna ao chamdor um valor INTEIRO (int), do seguinte
modo:
- se o valor for igual à constante EOF, então ocorreu um
erro durante a leitura;
- qualquer outro valor será maior ou igual a zero, e indicará
o código do caráter lido (ao ser convertido para char, será
o próprio caráter).
NOTA: Esta função lê caracteres, não teclas. Teclas especiais,
como Shift, Control, CapsLock, Alt, AltGr, Pause e algumas
outras podem não produzir efeito nenhum (a não ser quando
combinadas com outras teclas). Outros tipos de teclas es-
peciais, como as setas, teclas de função, Home, PageUp,
PageDown, Del, Insert, Backspace, Tab, entre outras, podem
produzir múltiplos caracteres de uma vez só. Esta função
não trata tais casos. A função getch() da Curses é mais
esperta, reconhecendo as sequências de caracteres de
algumas dessas teclas especiais, e substituindo-as por
valores de retorno específicos.
*/
int my_getch(void){
struct termios oldattr, newattr;
unsigned char ch;
int retcode;
tcgetattr(STDIN_FILENO, &oldattr);
newattr=oldattr;
newattr.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newattr);
retcode=read(STDIN_FILENO, &ch, 1);
tcsetattr(STDIN_FILENO, TCSANOW, &oldattr);
return retcode<=0? EOF: (int)ch;
}