Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Quelques question de programmation en C

2 views
Skip to first unread message

PaulK

unread,
Dec 17, 2009, 2:06:05 PM12/17/09
to
Bonsoir,

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

Mickaël Wolff

unread,
Dec 17, 2009, 2:30:00 PM12/17/09
to
PaulK a �crit :

> 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

PaulK

unread,
Dec 17, 2009, 2:46:44 PM12/17/09
to
Micka�l Wolff a �crit :

> PaulK a �crit :
>
>> 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. :)

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) !

Richard Delorme

unread,
Dec 17, 2009, 3:38:38 PM12/17/09
to
Le 17/12/2009 20:46, PaulK a �crit :
> Micka�l Wolff a �crit :
>> PaulK a �crit :

>>
>>> 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. :)

>
> 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$

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

Samuel Devulder

unread,
Dec 17, 2009, 4:05:38 PM12/17/09
to
PaulK a �crit :

> 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.

Antoine Leca

unread,
Dec 18, 2009, 7:00:36 AM12/18/09
to
PaulK �crivit :

> 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.

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

PaulK

unread,
Dec 18, 2009, 11:20:08 AM12/18/09
to
Richard Delorme a �crit :

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 ?

0 new messages