[Resolvido] Qual função de C retorna um carastere sem precisar premir o enter?

Iniciado por edjin, 22 de Agosto de 2011, 22:21

tópico anterior - próximo tópico

edjin

Sou novo na programação C, e gostaria de saber qual função (ou método utilisado) retorna um caractere sem o uso do enter.
Digamos que em dado momento o programa em questão esperasse uma entrada do teclado para escolher entre executar função
funcaoX(); ou funcaoY(), sem a nessecidade de premir o enter; No exemplo o scanf() espera que o usuário aperte ENTER

#include <stdio.h>
char tecla;

main()
{

printf("escolha a tecla A ou B:");

scanf("%c",&tecla); /* Aqui espera premir o ENTER para retornar o caractere */

if(tecla=='A')  funcaoX();
if(tecla=='B') funcaoY();

return 0;

}


no mais agradeco a toda comunidade.


           

thesesshoumaru


fpissarra

Citação de: thesesshoumaru online 23 de Agosto de 2011, 00:50
Se não me engano,

tecla = getchar();

funciona tranquilamente.

thesesshoumaru, getchar() espera pelo <enter> ou por EOF.

edjin, uma vez que estamos falando de Ubuntu aqui, dê uma olhada na biblioteca ncurses (aqui e aqui).

edjin

 :) Antes de mais nada muito obrigado pela ajuda de vocês ;D. Realmente uma ótima alternativa seria a NCurses, pois nela já teriamos a função getch() naturalmente, (E pra não deixar de comentar, poderiamos contar com uma infinidade de possibilidades como, a sintaxe de cores, funções para o uso do mouse... ), Uma maneira muito interessante de se ter o mesmo (ou quase...) resultado seria implementar essa função direto no arquivo do programa, ou criar um arquivo de cabeçalho no diretório /usr/include e usar como uma biblioteca natural do C.

Lembrando que, dessa maneira, estariamos mudando as caracteristicas da estrutura do terminal por um breve momento, mas não deixa de ser mais uma pra coleção. ;)  Abraços

Segue o codigo da função:
#include <stdio.h>
#include <termios.h>
#include <unistd.h>

int getch(){
struct termios oldt;
struct termios newt;
int ch;

tcgetattr(STDIN_FILENO &oldt);
newt = oldt;
newt.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
ch = getchar();
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
return ch;
}

fpissarra

Citação de: edjin online 23 de Agosto de 2011, 14:19Lembrando que, dessa maneira, estariamos mudando as caracteristicas da estrutura do terminal por um breve momento, mas não deixa de ser mais uma pra coleção. ;)  Abraços

Achei a solução excelente! ;)