Votre question

Renvoi de valeur scanf

Tags :
  • Buffer
  • Programmation
Dernière réponse : dans Programmation
19 Février 2007 12:08:26

Bonjour,

j'aimerais savoir comment, en langage C, vider le tampon d'un scanf.
De même, comment peut-on demander une autre valeur dans le cas où un char (ex : +) ou un nombre (float ou int par exemple) n'est pas valide? (exemple: 1.5 pour %d).
De plus, comment peut-on faire pour négliger les espaces et les retour à la ligne insérer par l'utilisateur?


Merci beaucoup.

Autres pages sur : renvoi valeur scanf

19 Février 2007 12:37:02

Erkana a dit :
Bonjour,

j'aimerais savoir comment, en langage C, vider le tampon d'un scanf.

en vidant le buffer d'entrée:
  1. fflush (stdin);


Erkana a dit :

De même, comment peut-on demander une autre valeur dans le cas où un char (ex : +) ou un nombre (float ou int par exemple) n'est pas valide? (exemple: 1.5 pour %d).

scanf va lire que ce qui correspond à son masque.
si tu demandes un entier et que l'utilisateur rentre 1.5, tu n'auras que 1 et tu ne pourras pas savoir si l'utilisateur a rentré une mauvaise valeur.
pour vérifier l'entrée de l'utilisateur, il faut saisir une chaine de caractères et après tu vérifies selon tes besoins (atoi, atof...)

Erkana a dit :

De plus, comment peut-on faire pour négliger les espaces et les retour à la ligne insérer par l'utilisateur?

je t'invite à lire cette doc assez bien foutue:
http://xrenault.developpez.com/tutoriels/c/scanf/
19 Février 2007 12:53:15

Merci mais j'avais déjà lu ce tutorial. J'y ai vu la façon de négliger les espaces avant la saisie, mais pas pendant.
Si je me souviens bien, ceci:

int i = scanf ("%c%f", a, b);

va me donner soit une valeur 0, soit une valeur Eof pour i. Donc je pensais boucler en insérant:

while ( i == Eof) {
printf("Insert a char and a float");
fflush(stdin);
int i = scanf ("%c%f", a, b);
}

Cette boucle serait-elle valide?
Contenus similaires
Pas de réponse à votre question ? Demandez !
19 Février 2007 13:52:32

la valeur de retour est égale:
EOF (et non Eof) si:
- il n'y a plus d'entrée avant que la premiere valeur ne soit lue
- en cas d'erreur, dans ce cas tu peux connaitre l'erreur avec ferror
0: aucune entrée
n: le nombre d'entrée qui sont satisfaites


ta boucle peut etre valide en changeant EOF, et je sais pas comment t'as déclaré a et b mais il faut que ca soit des pointeurs
19 Février 2007 21:51:35

coca25 a dit :
en vidant le buffer d'entrée:
  1. fflush (stdin);



scanf va lire que ce qui correspond à son masque.
si tu demandes un entier et que l'utilisateur rentre 1.5, tu n'auras que 1 et tu ne pourras pas savoir si l'utilisateur a rentré une mauvaise valeur.
pour vérifier l'entrée de l'utilisateur, il faut saisir une chaine de caractères et après tu vérifies selon tes besoins (atoi, atof...)


je t'invite à lire cette doc assez bien foutue:
http://xrenault.developpez.com/tutoriels/c/scanf/


Non, fflush(stdin) est à ne surtout pas utiliser, son comportement n'est pas décrit par la norme (uniquement pour les flux sortants), celà provoque donc un comportement indéterminé, tout peut arriver. A la place, on utilise une fonction du genre

  1. void purge(void)
  2. {
  3. int c;
  4. while ((c = getchar()) != '\n' && c != EOF)
  5. {
  6. }
  7. }


Pour scanf, je te conseille d'apprendre à utiliser la fonction fgets pour réaliser tes saisies. Tu pourras donc faire des saisies de manière sécurisée. Ensuite, pour convertir un char * vers un double, tu as par exemple la fonction strtod ou strtol pour un char * vers un long (et oui, la gamme des ato* est obsolète).
19 Février 2007 21:58:38

effectivement en relisant mieux le man de fflush, il parle pas de flux entrant, au temps pour moi :) 
20 Février 2007 11:15:39

Petite recherche sur developpez.com

Vider le tampon clavier :

La méthode la plus sûre pour vider le buffer clavier consiste à consommer tout les caractères présents dans ce buffer jusqu'à ce qu'il soit vide :
#include <stdio.h>


  1. int c;
  2. while ((c = getchar()) != '\n' && c != EOF); /* mange le tampon */


Pourquoi ne faut-il pas utiliser fflush(stdin) pour vider le buffer clavier ?

Il est très fréquent de rencontrer dans des fichiers sources la ligne
  1. fflush(stdin);



afin de vider le buffer clavier encombré par les restes des saisies précédentes.
Toutefois l'utilisation de la fonction fflush() dans ce but est une erreur, en effet la norme ne précise le comportement de fflush() que sur les flux sortants, son effet sur les flux entrants dépend de l'implémentation.


Pourquoi est-il déconseillé d'utilise scanf()

La fonction scanf() est une fonction destinée, comme le f dans son nom l'indique, aux saisies formatées et s'avère ainsi très peu adaptée aux saisies humaines qui peuvent présentées des erreurs de format, ces erreurs de formats pouvant entrainerr des débordements de tableau, des boucles infinies, des perturbations sur les saisies suivantes, etc.
Il ainsi conseillé de remplacer les saisies formatées effectuées par scanf() par une lecture complète via fgets() suivie d'une analyse de la chaîne lue.





20 Février 2007 15:10:23

Merci pour vos réponses. Par contre, existe-t-il un moyen de vider partiellement le tampon?
Par exemple: J'entre un char et un float. Si la valeur du char n'est pas un opérateur (+ - * /), alors il efface la valeur du char mais conserve la valeur du float (si celle-ci est correcte évidemment).

Merci :) 
a b L Programmation
20 Février 2007 22:44:24

Il me semble que le flush du clavier est une fonction de l'interuption matérielle 16h, donc il ne me semble pas possible de ne le vider directement de façon partielle.
Il faut lire et interpréter tous les caractères toi-même

sinon, pour le fflush, f=>fichier et flush=>tirer la chasse ;) 
20 Février 2007 22:48:25

je dirais plutot que f correpond à flux, d'ailleurs ca peut etre la console :) 
a b L Programmation
20 Février 2007 22:56:52

Moi je dirais plutôt que le "f" est "file descriptor" puisque ça fonctionne d'abord pour les fichiers, stdin et stdout ne sont que des descripteur particuliers.
D'autant que "flux", en anglais, se dit "stream" :p 
Bon c'est sûr qu'on peut voir les descripteur de fichiers comme des flux (d'ailleurs ça s'applique sur les sockets).
20 Février 2007 23:10:15

:jap: 

on peut aussi dire flux en anglais mais effectivement ca s'applique plutot à l'electronique
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS