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

Bibliothèque standard C Discussion :

sscanf et format


Sujet :

Bibliothèque standard C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Janvier 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 11
    Par défaut sscanf et format
    Bonsoir à tous,

    Je viens en aide dans ce forum, car j'ai un petit soucis que je n'arrive pas du tout à résoudre.

    J'ai le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // Déclarations
    int nbJoueurs = 0;
    char nomJoueur[15], buffer[15];
     
    // Portion de code "foirreuse"
    fgets(buffer, sizeof buffer, stdin);
    erreur = sscanf(buffer, "%1[2-4]\n", &nbJoueurs);
    Voila, je souhaiterai dans mon programme qu'un utilisateur tape un nombre au clavier et que celui-ci soit soumis à un controle de syntaxe bien particulier. J'ai trouvé la syntaxe à adopté, mais le soucis, c'est que la variable &nbJoueurs prend la valeur du chiffre tapé mais en Décimal par rapport à la table ASCII.

    Syntaxe désirée : un chiffre et un seul entre 2 et 4 inclus.
    buffer | nbJoueurs
    2 | 51
    3 | 52
    4 | 53

    A quoi est du cette modif ? Pouvez-vous me donner la soluce afin d'avoir exactement le même chiffre ?

    Comment faire ?

    Merci à tous,
    Thomas.

  2. #2
    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 thomasg44 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // Déclarations
    int nbJoueurs = 0;
    char nomJoueur[15], buffer[15];
     
    // Portion de code "foirreuse"
    fgets(buffer, sizeof buffer, stdin);
    erreur = sscanf(buffer, "%1[2-4]\n", &nbJoueurs);
    Voila, je souhaiterai dans mon programme qu'un utilisateur tape un nombre au clavier et que celui-ci soit soumis à un controle de syntaxe bien particulier. J'ai trouvé la syntaxe à adopté, mais le soucis, c'est que la variable &nbJoueurs prend la valeur du chiffre tapé mais en Décimal par rapport à la table ASCII.

    Syntaxe désirée : un chiffre et un seul entre 2 et 4 inclus.
    buffer | nbJoueurs
    2 | 51
    3 | 52
    4 | 53

    A quoi est du cette modif ? Pouvez-vous me donner la soluce afin d'avoir exactement le même chiffre ?

    Comment faire ?
    Je connais très mal *scanf() et pas du tout cette syntaxe. En tout cas, mon compilateur ne l'aime pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    main.c: In function `main':
    main.c:16: warning: char format, different type arg (arg 3)
    Visiblement, il faut fournir l'adresse d'un char...
    Ceci fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    /* http://delahaye.emmanuel.free.fr/clib/ */
    #include "ed/inc/prt.h"
     
    #include <stdio.h>
     
    int main (void)
    {
       int fin = 0;
       while (!fin)
       {
          char nbJoueurs;
          char buffer[15];
          int n;
     
          fgets (buffer, sizeof buffer, stdin);
          PRT_S (buffer);
     
          n = sscanf (buffer, "%1[2-4]\n", &nbJoueurs);
          PRT_I (n);
     
          if (n == 1)
          {
             PRT_C (nbJoueurs);
             fin = 1;
          }
          else
          {
             puts ("erreur de saisie");
          }
       }
     
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    a
    buffer       = 'a
    '
    n            = 0
    erreur de saisie
    1
    buffer       = '1
    '
    n            = 0
    erreur de saisie
    5
    buffer       = '5
    '
    n            = 0
    erreur de saisie
    3
    buffer       = '3
    '
    n            = 1
    nbJoueurs    = '3'
     
    Press ENTER to continue.
    Evidemment, il reste à convertir '3' en 3, mais les regles du C concertant les caractères de '0' à '9' (leurs valeurs doivent être consécutives, et croissantes de 1 en 1), autorisent de retirer '0' pour obtenir la valeur numérique :
    NOTA : J'insiste sur le fait que cette manip n'est valide qu'avec les 'digits', c'est à dire les caractères '0' à '9' uniquement. Je ne veux voir ça avec les autres caractères, car ce n'est pas portable.

Discussions similaires

  1. separateur decimal et format dans sscanf
    Par michelp38 dans le forum C
    Réponses: 2
    Dernier message: 17/06/2011, 09h48
  2. [sscanf] Lire une chaine formatée contenant des []
    Par gangsoleil dans le forum Bibliothèque standard
    Réponses: 3
    Dernier message: 11/09/2008, 09h09
  3. sscanf et format
    Par Goundy dans le forum C
    Réponses: 7
    Dernier message: 06/01/2007, 21h16
  4. lire une image au format RAW
    Par Anonymous dans le forum OpenGL
    Réponses: 5
    Dernier message: 20/05/2002, 00h11
  5. Réponses: 3
    Dernier message: 06/05/2002, 18h24

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