IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Saisie fgets


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut Saisie fgets
    Hello,
    je souhaite réaliser une fonction de saisie qui permet de filtrer la saisie de l'utilisateur de telle sorte que celui-ci ne puisse entrer que des valeur numérique (avec virgule).
    J'ai deux questions:
    fgets prend en paramètre le nombre n de caractéres. La saisie s'arrète lorsque l'utilisateur tape sur entré (si je me trompe pas) et seul les n premiers caractères correspondant au paramètre fourni sont stocké dans la chaine.
    Ya t-il un moyen d'empecher la suite de la saisie lorsque l"utilisateur atteint le nombre max de caractéres?

    De plus, comment faire la différence entre un caractére et un chiffre, pour que je puisse identifier les erreur de saisies possibles (saisie de lettre, de plusieurs virgules etc..)?

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Il faut utiliser fgets et strtod (ou sscanf).

    Si tu as un buffer de 10 caractere par exemple, tu as donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char buffer[10];
    ...
    fgets(buffer, sizeof buffer, stdin);
    ...
    Si l'utilisateur saisie une chaine de plus de 10 caracteres, seul les 9 premiers seront stocké dans buffer (une place pour le \0). Les autres caracteres sont donc dans le buffer d'entrée, il faut donc le vider via fgetc(stdin)

  3. #3
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Salut, non ce que tu veux faire n'est pas possible sans casser le niveau d'abstraction qu'est le systeme de console
    En effet, l'application n'est pas directement liée au clavier, donc tout ce qui demande des choses assez interactives au niveau du clavier (ex : getch() de borland c) est possible mais est à eviter

  4. #4
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut
    Dc pâs possible d'arréter la saisie?
    De toute facon c'est pas essenciel.
    En revanche, analyser l'entré de l'utilisateur est important.
    Si celui-ci entre (par erreur) 3Z4.8908, ou si l'utilisateur utilise des virgules au lieu de points, je voudrai pouvoir le détecter et recommencer la saisie. Il faut donc que je puisse identifier les caractéres autre que chiffre et point et je ne voi pas comment faire.

  5. #5
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Pour ton controle de saisie, tu peux utiliser strtod comme a dit Skyrunner

    Apres pour limiter la saise, ptet que ncurses (sous linux) le permet (chais pas trop)

  6. #6
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut
    strtod converti une chaine en double. Mais lorsqu'il y a une erreur dans la chaine (une lettre), la fonction arrête la conversion et on obtient donc le mauvais nombre...
    Ex: j'entre 4R78.678, strtod me renverra 4.
    Ce n'est pas ce que je souhaite. Je voudrait recommencer la saisie si un caractére autre qu'un chiffre a été entré.

  7. #7
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Alors je pense qu'il te faudra d'abord pourcourir la chaine caractere par caractere pour savoir si elle est uniquement constituée de chiffres et d'un seul point

  8. #8
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par vinzzzz
    strtod converti une chaine en double. Mais lorsqu'il y a une erreur dans la chaine (une lettre), la fonction arrête la conversion et on obtient donc le mauvais nombre...
    Ex: j'entre 4R78.678, strtod me renverra 4.
    le second parametre de strtod() permet de savoir ou dans ta chaine la conversion s'est arretee, il suffit donc de regarder ce parametre pour savoir si toute la chaine a ete consomme ou seulement une partie (ce qui signifie qu'il y a eu une erreur).

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par vinzzzz
    je souhaite réaliser une fonction de saisie qui permet de filtrer la saisie de l'utilisateur de telle sorte que celui-ci ne puisse entrer que des valeur numérique (avec virgule).
    Filtrer... tu veux dire en temps réel ? Pendant la frappe ?

    Pas possible en C standard. Le C n'a pas le notion de clavier, mais d'I/O, et pour stdin, le '\n' est obligatoire pour debloquer l'attente.
    J'ai deux questions:
    fgets prend en paramètre le nombre n de caractéres.
    Pas exactement. Il prend en paramètre la taille du tableau dans lequel il va stocker les caractères lus. Sauf action contraire, les caractères non lus sont toujours là. Il suffit de rappeler fgets()...
    La saisie s'arrète lorsque l'utilisateur tape sur entré (si je me trompe pas) et seul les n premiers caractères correspondant au paramètre fourni sont stocké dans la chaine.
    Presque. En fait une place est toujours laissée pour le 0 final, soit n-1 caractères utiles.
    Ya t-il un moyen d'empecher la suite de la saisie lorsque l"utilisateur atteint le nombre max de caractéres?
    Non. Pas en C standard. Mais on peux les ignorer après le <enter>.
    De plus, comment faire la différence entre un caractére et un chiffre, pour que je puisse identifier les erreur de saisies possibles (saisie de lettre, de plusieurs virgules etc..)?
    Une fois que la ligne est saisie, on peut commencer à l'analyser. On peut filtrer et/ou convertir avec sscanf(), convertir avec strto[u]l|d() en vérifiant la validité de la conversion... C'est très ouvert...

    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers

  10. #10
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Octobre 2005
    Messages : 141
    Par défaut
    Je pensais à une technique assez simple, récupérer une chaine, trier les lettres et chiffres avec les fonctions de la bibliothèque ctype.h et assembler ça avec strcat non ?

  11. #11
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Kr00pS
    Je pensais à une technique assez simple, récupérer une chaine, trier les lettres et chiffres avec les fonctions de la bibliothèque ctype.h et assembler ça avec strcat non ?
    Bah, les fonctions strto*() font déjà tout ce qu'il faut. Il faut apprendre à s'en servir, c'est tout. Lire la doc (notamment le rôle du 2ème paramètre).

Discussions similaires

  1. Réponses: 7
    Dernier message: 12/05/2003, 22h50
  2. Réponses: 3
    Dernier message: 19/03/2003, 15h19
  3. [debutant]Limiter le temps de saisi
    Par Nasky dans le forum C
    Réponses: 5
    Dernier message: 17/03/2003, 15h47
  4. [Kylix] saisie d'@ IP kylix2 OE
    Par sdoura2 dans le forum EDI
    Réponses: 1
    Dernier message: 10/11/2002, 01h54
  5. [Kylix] crypter la saisie sous kylix
    Par nahmsath dans le forum EDI
    Réponses: 2
    Dernier message: 15/10/2002, 13h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo