(Courriels de diversion: <indexee@ensembliers-adresserions.com> <plantureux@reconquises-transposais.com> <devinera@plombons-timbrees.com> <elles@debudgetisa-affilage.com> <hamburger@irriguions-recluses.com> <deleguons@faufilerons-rajoutees.com> <aerospatiaux@sombrerais-infligeaient.com> <plissions@filmait-flouant.com> <troqua@perennites-fugue.com> <recoures@diapo-spatiale.com> )


Le Mercredi 19 Octobre 2005 13:19, Baptiste MATHUS a écrit :

> > 2005/10/19, Georges Favre :
> > >             scanf("%c",&c);
> > >             printf("\nJ'ai reçu le caractère %c dans l'adresse
> > %p\n\n",c,&c);
> >
> > scanf fonctionnera mieux avec des chaînes de caractères. Et les
> > chaînes en C se terminent par le caractère null. Et comme déjà dit,
> > scanf ne contrôle pas le terminal, et le terminal ne lui envoie un
> > résultat qu'après appuie sur la touche ENTREE.
> >
> > En gros, ton "erreur", c'est que tu utilises un char au lieu d'un
> > char[] pour stocker le résultat. Je sais bien que &c retourne un
> > char*, mais scanf attend un char* dans lequel il mettra un \0 à la
> > fin. En fait, il ne faudrait pas utiliser %c seul.
> >
> > Il n'y a pas de solution satisfaisante sans utiliser de bibliothèque
> > tierce. NCurses est un très bon choix, comme déjà proposé.
> Je ne suis pas d'accord. À moins que George ne veuille pouvoir saisir un 
seul
> caractère, sans retour à la ligne, la fonction fgets répond très bien à ce
> besoin de lecture au clavier.
> 
> De toute façon, c'est une règle qui me semblait très claire depuis que j'ai
> appris à programmer : scanf => poubelle pour la prod. Tu dois t'attendre à
> recevoir de la bouse, donc des chaines de caractères par exemple même si tu
> attends un chiffre et ensuite vérifier la saisie dans cette chaîne.
> 
> Le gros intérêt de fgets est qu'il est capable de limiter le nombre de
> caractères saisis et donc éviter un buffer overflow si l'utilisateur tape 
plus
> de caractères que la taille du buffer que tu as déclaré.
> 
> http://www.lri.fr/~aze/page_c/aide_c/fgets.html
> 
> Exemple d'utilisation si tu veux récupérer un caractère :
> 
> char buf[10];
> fgets(buf, 10, stdin);
> 
> => Là tu vérifies buf[0] et si c'est autre chose que le caractère que tu 
veux,
> tu engueules l'utilisateur et tu boucles.
> 
Merci tout d'abord à tous ceux qui se sont penchés sur mon problème :
Thomas, Guillaume, Tharibo et Baptiste.
certains conseils dépassaient mon niveau de connaissance en C comme 
en Linux : NCurses (si quelqu'un connaît une bonne doc accessible, ça 
m'intéresse!) ou le "mode canonique" (?).
Par contre plusieurs soulignaient le fonctionnement douteux de scanf 
avec des caractères. fgets me séduisait assez avec sa limitation de 
caractères saisis, mais je n'ai pas pu le faire fonctionner. Affaire 
de syntaxe ? j'avais utilisé : fgets(buffer,10,stdin);  sans succès.
Finalement j'ai pris "gets(buffer);"  en dépit du warning de gcc. 
Cela marche très bien avec un "strcmp" comme comparaison de 2 chaînes.
En fait "scanf("%s",buffer);" marche aussi si ce n'est un mauvais 
fonctionnement sur un retour de chaîne vide.

Il n'empêche qu'il est anormal qu'un ordre présent dans toutes les 
docs comme scanf("%c",caractere) ne passe pas dans un programme, 
alors qu'il marche au poil dans les autres.

Enfin merci encore à tous de m'avoir dépanné.

-- 
Georges Favre
Domaine de Michaud
11290  Roullens
tel : 04 68 26 90 38



--------------------------------------------------------------------
Les listes de diffusion occultes: <URL:http://www.CULTe.org/listes/>