je suis un d�butant en langage C, je ne r�alise que quelques programmes
relativement simples, comme des � jeu du nombre myst�re �.
J'aurais voulu savoir deux choses :
1 - Comment faire pour obtenir un programme en terminal (que l'on lance
depuis bash et qui n'a pas d'interface graphique) qui s'ouvre comme
Mutt, ou Emacs, c'est � dire qui prend tout le terminal quand on l'ouvre
et ce jusqu'� ce que l'on le ferme.
2 - Je voudrais enregistrer la saisie de l'utilisateur dans un buffer,
depuis une fonction void. scanf ne semble marcher que depuis main(*).
Comment puis-je faire ?
Merci bien beaucoup !
PaulK
> 1 - Comment faire pour obtenir un programme en terminal (que l'on lance
> depuis bash et qui n'a pas d'interface graphique)
A la base, l'application ne sait pas ce qu'est un terminal pas plus
qu'une fenetre graphique. En revanche, des fichiers sp�ciaux sont
ouverts (stdin, stdout, stderr) qui permettent de communiquer avec
l'application appelante (en l'occurence, le terminal qui lance
l'application).
> qui s'ouvre comme
> Mutt, ou Emacs, c'est � dire qui prend tout le terminal quand on l'ouvre
> et ce jusqu'� ce que l'on le ferme.
Ce sont des programmes qui utilisent des biblioth�ques telles que
ncurses. Ces biblioth�ques encapsulent la communication avec le
terminal, ce qui permet de contr�ler l'affichage produit par le terminal.
ncurses requiert beaucoup de rigueur pour �tre utilis�, c'est
pourquoi je ne penses pas que tu devrais y jeter ton enthousiasme de
d�butant. :)
> 2 - Je voudrais enregistrer la saisie de l'utilisateur dans un buffer,
> depuis une fonction void. scanf ne semble marcher que depuis main(*).
> Comment puis-je faire ?
scanf est une fonction qui � fonctionne � depuis partout. Tu peux
nous donner un exemple de code ?
--
Micka�l Wolff aka Lupus Michaelis
http://lupusmic.org
D'accord. Ce n'est pas grave.
>> 2 - Je voudrais enregistrer la saisie de l'utilisateur dans un buffer,
>> depuis une fonction void. scanf ne semble marcher que depuis main(*).
>> Comment puis-je faire ?
> scanf est une fonction qui � fonctionne � depuis partout. Tu peux nous
> donner un exemple de code ?
Exemple :
#include <stdio.h>
#include <stdlib.h>
int input(void);
int main(void)
{
char abc;
scanf("%1c", &abc);
printf("scanf_main : %c", abc);
char abcde = input();
printf("scanf_input : %c", abcde);
return 0;
}
int input(void)
{
char inp = 0;
scanf("%1c", &inp);
return inp;
}
La fonction input ne me demande rien, j'ai, dans le terminal, le
r�sultat suivant :
paulk@paulk-desktop:~/Documents/Programmation/lenombremystere/bash$ ./input
5
scanf_main : 5scanf_input : 0
paulk@paulk-desktop:~/Documents/Programmation/lenombremystere/bash$
Sachant que j'ai rentr� le premier 5 � la main et que pour le %c suivant
scanf_input, rien ne m'a �t� demand� (enchainement apr�s l'entr�e du 5) !
Je parie que cette sortie est fausse (ce n'est pas ce que t'on programme
a affich�).
Soit tu as tap� 50[entr�e] et l'affichage est :
paulk@paulk-desktop:~/Documents/Programmation/lenombremystere/bash$ ./input
50
scanf_main : 5scanf_input :
0paulk@paulk-desktop:~/Documents/Programmation/lenombremystere/bash$
soit tu as tap� 5[entr�e] et l'affichage est :
paulk@paulk-desktop:~/Documents/Programmation/lenombremystere/bash$ ./input
5
scanf_main : 5scanf_input :
paulk@paulk-desktop:~/Documents/Programmation/lenombremystere/bash$
Mais dans tous les cas ton programme ne peut afficher � la fois un 0 non
saisi et un retour � la ligne.
> Sachant que j'ai rentr� le premier 5 � la main et que pour le %c suivant
> scanf_input, rien ne m'a �t� demand� (enchainement apr�s l'entr�e du 5) !
Non, tu as entr� 5 et un retour � la ligne, soit deux caract�res, les
deux scanf fonctionnent comme attendu et lisent les deux caract�res.
--
Richard
> 1 - Comment faire pour obtenir un programme en terminal (que l'on lance
> depuis bash et qui n'a pas d'interface graphique) qui s'ouvre comme
> Mutt, ou Emacs, c'est � dire qui prend tout le terminal quand on l'ouvre
> et ce jusqu'� ce que l'on le ferme.
==> man curses
ou man ncurses
(c'est la version moderne du pr�c�dent)
http://www.manpagez.com/man/3/ncurses/
http://web.cs.mun.ca/~rod/ncurses/ncurses.html
Si tu sais programmer et surtout si tu comprends qu'il n'y a rien de
magique et que tout est indiqu� dans le man, alors tu peux faire appel �
cette librairie pour contr�ler le terminal: afficher du texte � une
coordon�e pr�cise, changer les couleurs, r�cup�rer des caract�res
directement au clavier sans �cho �cran et sans retour � la ligne etc.
Attention pendant la mise au point d'un prog qui joue avec curses, on
arrive fr�quemment � casser son terminal parce que le prog est sorti (ou
a plant�) sans remettre le terminal dans son mode d'origine. Mais bon,
une fois qu'on s'est fait avoir on fait gaffe. C'est le m�tier qui
rentre! (on apprends de ses erreurs).
>
> 2 - Je voudrais enregistrer la saisie de l'utilisateur dans un buffer,
> depuis une fonction void. scanf ne semble marcher que depuis main(*).
Ben non.. main() est une fonction/proc�dure comme une autre. Il n'y a
rien de magique l� dessous: scanf() marche partout pareil.
sam.
Il n'y a pas de m�thode standard, cela d�pend de l'architecture cible.
En gros, si tu as entendu parler de KDE ou de GNOME, cela sert
exactement � cela (et � quelques petites choses en plus ;-), mais la
base est � ce niveau-l�).
Dans les environnements *nix/Linux en mode console (terminal),
curses/ncurses est ce qui est le plus r�pandu (mais pas forc�ment ce qui
est le plus simple � manipuler).
Les environnements DOS sont � ce niveau plus simples (parce que la
diversit� � g�rer est beaucoup plus r�duite, il n'y a qu'un seul genre
de clavier et un seul genre d'�cran, et qui plus est ses dimensions sont
souvent consid�r�es, � tord, comme fig�es � 80x25); Borland avait fait
une grande partie de sa r�ussite � la fin des ann�es 80 avec son
environnement <conio.h>, c'est probablement plus facile � ma�triser pour
un d�butant (plus facile d'obtenir des r�sultats probants), quite �
passer � ncurses d�s que l'on ma�trise le truc.
Le conio.h de Borland est h�rit� de TurboPascal ; attention, les
versions de Microsoft, de Watcom ou de DigitalMars sont plus succinctes,
en particulier ne g�re pas les �fen�tres� qui limite l'affichage � une
portion de l'�cran. La biblioth�que de Borland a �t� port�e ici ou l�,
en particulier vers DOS 32 bits dans DJGPP ou vers Linux (en utilisant
curses par dessous).
Antoine
Huhu, a peu de choses pr�s, si.
J'ai juste ins�r� quelques retours � la ligne pour plus de lisibilit�,
mais le 0 n'a pas �t� rentr� et a bien �t� affich� !
> Soit tu as tap� 50[entr�e] et l'affichage est :
>
> paulk@paulk-desktop:~/Documents/Programmation/lenombremystere/bash$ ./input
> 50
> scanf_main : 5scanf_input :
> 0paulk@paulk-desktop:~/Documents/Programmation/lenombremystere/bash$
Oui, c'est celui-ci !
> soit tu as tap� 5[entr�e] et l'affichage est :
> paulk@paulk-desktop:~/Documents/Programmation/lenombremystere/bash$ ./input
> 5
> scanf_main : 5scanf_input :
> paulk@paulk-desktop:~/Documents/Programmation/lenombremystere/bash$
>
> Mais dans tous les cas ton programme ne peut afficher � la fois un 0 non
> saisi et un retour � la ligne.
>> Sachant que j'ai rentr� le premier 5 � la main et que pour le %c suivant
>> scanf_input, rien ne m'a �t� demand� (enchainement apr�s l'entr�e du 5) !
>
> Non, tu as entr� 5 et un retour � la ligne, soit deux caract�res, les
> deux scanf fonctionnent comme attendu et lisent les deux caract�res.
D�sol�, j'ai un peu modifi� le rendu pour plus de clart�, et je me
souviens avoir entr� 50 et l'avoir corrig� en 5.
Bref, donc le 2�me scanf prend le retour � la ligne�
Comment puis-je contourner ce probl�me ?