Programme en C en console

Salut !

J’ai besoin de créer en C un programme en mode console, sous Linux (c’est pareil que en console sous Windows en gros).

A un moment ce programme demande un mot de passe à l’utilisateur. J’aimerai que ce mot de passe soit invisible lorsque on le tape (ou remplacé par des *, enfin, du moment qu’on le voit pas…).

Je crois que sous Windows c’est possible avec la fonction getch, contenue je crois dans iostream.h, mais ce dernier est propriétaire et n’existe donc pas sous Linux.

Existe t-il une fonction me permettant de masquer le texte que je saisis au clavier ? Si possible une fonction commune à Linux et Windows…
C’est peut être possible avec getchar non ?

Merci de votre aide :stuck_out_tongue:

google, premier lien:
getch sous Linux

Je crois que sous Unix, je viens de voir ça. Je suis pas sûr que la méthode soit la meilleure. En gros, il faut régler le terminal du programme pour qu’il ne renvoie pas les caractères tapés. D’après ce qu’on a vu (le prof a tendance à pas forcément être très précis et j’ai pas encore testé ça).
Dans la strcuture <termios.h>, il y a un champ tcflag_t c_lflag qui est une combinaison bit à bit des modes ISIG (émission automatique de signaux), ICANON (termine ou non l’entrée par return) et ECHO (afficher ou non sur la sortie standard ce qui est lu par l’entrée standard. Je suppose donc que désactiver ECHO le temps de taper le mot de passe devrait faire l’affaire sous Unix.

J’ai même un exemple d’utilisation :

#include <termios.h> ... struct termios Terminal ... Terminal.c_lflag & = ~ICANON & ~ISIG & ~ECHO; // là je suppose que ça active le mode ECHO ...

Sinon, man 2 et fouiller /usr/include semblent être des pistes intéressantes pour plus d’informations, notamment sur l’utilisation des modes locaux.

Tu peux pas regarder les sources de passwd ? :stuck_out_tongue:

LeBaronNoir > il doit y avoir plus simple que ça… mais merci quand même ça pourra me servir :stuck_out_tongue:
Je suis quasiment sûr que getch permet de faire celà.

En tout cas pour getch sous Linux, j’ai voulu tester et ça ne marche pas:

[code]#include <stdio.h>
#include <curses.h>

int main()
{
char a;
a=getch();
printf("%c",a);
}[/code]

Erreur renvoyée:

[quote]/home/bluelambda/tmp/ccdaltSs.o(.text+0x21): In function main': : undefined reference to stdscr’
/home/bluelambda/tmp/ccdaltSs.o(.text+0x26): In function main': : undefined reference to wgetch’
collect2: ld returned 1 exit status[/quote]
Ca ne doit pas être comme ça que ça s’utilise…

L’erreur ne vient pas de char a; car même si je met int c’est la même erreur.

Des solutions ?

EDIT : désolé mais je suis débutant en C :stuck_out_tongue:

EDIT : [quote]Tu peux pas regarder les sources de passwd ?[/quote]J’y ai pensé mais je me suis dit que ça devait être trop compliqué, enfin je vais quand même jeter un coup d’oeuil :stuck_out_tongue:
Quelqu’un sait où se les procurer ?

a priori, getpass devrait faire ton bonheur…
Après, d’après certains manpage, c obsolète, comme technique…
Donc après, c’est à toi de voir.

J’ai trouvé ça :
http://www.siteduzero.net/vostutos/?s=viewtuto&tutoid=141

Et il y notamment une explication pour masquer le texte entré au clavier avec getch ! Là je suis donc en train de chercher pourquoi getch ne marche pas…

Vu ce qu’il te gueule dessus, je parie pour un #include oublié.

J’ai pourtant envoyé tout le code du programme de test ci-dessus… ya rien quoi, je vois pas trop quel include pourrait manquer…

bah il faut quand meme inclure le header C le plus rigolo du monde !

#include <conio.h>…

Ca veut dire quoi ?

Le header des entrées sorties connes n’existe pas sous Linux :stuck_out_tongue:

ncurses est l’équivalent de celui-ci, si j’arrive à m’en servir… ce qui n’est pas le cas.

Avec Visula C++ sous Windows j’ai testé, aucun problème, getch() n’affiche pas la touche pressée dans tous les cas :stuck_out_tongue:
Ensuite je met le résultat dans un tableau de caractères pour le comparer et on en parle plus.

Mais sous Linux, faudrai que j’arrive à utiliser getch() avec ncurses…

t’as inclus curses.h ?

(dans le man de getch ils disent que c’est dans ce fichier qu’il faut inclure)

Voici mon code d’essai:[code]#include <stdio.h>
#include <curses.h>

int main()
{
char a;
a=getch();
printf("%c",a);
}[/code]

GCC me renvoie l’erreur:

[quote]In function main': : undefined reference tostdscr’
: undefined reference to `wgetch’
collect2: ld returned 1 exit status[/quote]

Peut être y a t-il un paramètre spécial à entrer non ? Par exemple quand je compile en utilisant math.h je dois ajouter l’option -lm.

wep, à tout les coups tu fais pas référence à la librairie, essaye avec -lcurses (au pif), sinon fouille dans le répertoire lib de GCC (aucune idée d’où il est planqué sous linux), et cherche curse dans le tas, tu devrais trouver le nom du fichier à passer en param au linker.

Tu devrai jouer au loto toi, au hazard il semblerai que -lcurses soit bon :stuck_out_tongue:

On se rapproche mais il subsiste un problème, j’ai donc compilé le code que j’ai posté plus haut, mais au moment ou la ligne a=getch(); est lue, il me fait un Segmentation Fault.

Peut être n’est-ce pas comme ça que ça s’utilise ?

J’ai trouvé !

[code]#include <stdio.h>
#include <curses.h>

int main()
{
char cara;

printf("Salut!");

initscr(); &nbsp; &nbsp; // On initialise l'affichage
noecho(); &nbsp; &nbsp; // Les touches tapées sont invisibles

 cara = getch();     // Saisie de la touche tapée dans la variable cara
 printw(« \n\nCaractère : %c\n\n »,cara);     // Equivalent à printf
 getch();     //     Appuyer sur une touche pour continuer

endwin(); &nbsp; &nbsp; // On ferme proprement curses

}[/code]Tout est expliqué dans le code :stuck_out_tongue:

Pour compiler on ajoute comme l’a dit TwinSidE : -lcurses

Par contre :

  • lorsque l’on appele la fonction initscr();, tout ce qui étais affiché avant dans la console disparait (si vous avez utilisé printf juste avant, ce que printf a affiché on aura pas le temps de le voir).
  • lorsque l’on appelle la fonction endwin();, tout ce qui a été affiché avant disparait aussi.

Moi j’aimerai que rien ne disparaisse ! C’est possible ?

Comment utiliser cette librairie avec Visual C++ 6.0 et DevC++ ?

Est-il possible d’utiliser la librairie ncurses sous Windows avec Visual C++ ?

J’ai essayé de copier ma librairie sous Linux, mais dans tous les fichiers de la librairie les \ sont des / et Visual C++ ne peut pas la charger.

Quelqu’un connait l’adresse du site officiel de ncurses ou alors un lien vers la librairie pour Winodws ?

Merci!

[quote name=‘c0unt0’ date=’ 7 Apr 2005, 19:12’]bah il faut quand meme inclure le header C le plus rigolo du monde !

#include <conio.h>…
[right][post=“348292”]<{POST_SNAPBACK}>[/post][/right][/quote]

Sous windows, c’est plutôt celui là qu’il faut indiquer. Il contient getch
par exemple, mais ne connaissant pas ncurse, je suis incapable de te
dire si il y aura toutes les fonctions que tu utilises sous *NIX

Bonne compilation conditionnelle :P"