Réponse acceptée !
Tu es sous Windows ou Linux ? C'est le genre de précision que tu dois donner sinon c'est dur de t'aider.
Est-ce que cette solution a fonctionné pour toi ?
Sous Windows, ce que tu veux faire est possible. getch (ou _getch) te permet de récupérer un caractère comme tu l'as décrit dans ton besoin.
Sous Linux, cette fonction n'existe pas. Je l'ai donc émulé.
tcgetattr(STDIN_FILENO, &g_term_conf);
Sauvegarde du contexte actuel. En gros, j'enregistre la configuration actuelle de la console.
tcsetattr(STDIN_FILENO, TCSANOW, &g_term_conf);
Cette ligne remet la console dans son état initial.
Création d'un nouveau contexte de configuration de console.
newt.c_lflag &= ~(ICANON | ECHO);
ICANON est une option qui dit qu'on désactive les caractères spéciaux (notamment le fait d'appuyer sur entrée pour envoyer le caractère).
ECHO est une option qui dit si l'on affiche ce qui est tapé ou non.
D'ailleurs, j'aurais pu ne pas la désactiver au lieu de faire un "putchar(ch)" un peu plus loin.
Ce sont des masques de bits. C'est une notion avancées. Regarde sur internet si ça t'intéresse, mais je ne vais pas détailler cette notion.
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
Application des options choisies.
Récupère un caractère. Comme on est en mode "raw", le comportement est différent et il récupère le caractère sans attendre l'appuie sur la touche entrée.
putchar(ch); /* Pour émuler le comportement d'affichage */
Au final, inutile, il suffit que je ne désactive pas l'option ECHO.
tcsetattr(STDIN_FILENO, TCSANOW, &g_term_conf);
return ch;
On restaure la console en mode normal, avant de retourner le caractère récupéré.
Mon code en propre devrait être (sans les trucs inutiles):
Code C/C++ :
#include <termios.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
struct termios g_term_conf;
int unix_getch()
{
struct termios newt;
int ch;
newt = g_term_conf;
newt.c_lflag &= ~(ICANON);
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
ch = getchar();
tcsetattr(STDIN_FILENO, TCSANOW, &g_term_conf);
return ch;
}
int main(void)
{
int i = 0;
char line[21] = {0};
tcgetattr(STDIN_FILENO, &g_term_conf);
printf("Hello world!\n");
while (i < 20)
{
line[i] = unix_getch();
++i;
}
printf("\nLa ligne vaut %s\n", line);
return 0;
}
________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question