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 :

scanf avec le flag %as


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 59
    Par défaut scanf avec le flag %as
    bonjour,

    je viens de voir dans la doc GnuGcc le flag %a permettant (à priori) de ne pas être embêté lors de la lecture d'une chaîne de caractere:
    avec ce flag, le tableau est alloué dynamiquement: donc super pratique.
    Donc ni une ni deux, j'essaye le code donné en exemple et... marche pÔ! Bien sur, j'ai essayé de comprendre, j'ai bidouillé, mais je n'y arrive pas. Voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int i;
    char *variable,*value;
    scanf ("%a[a-zA-Z0-9] = %a[^\n]\n",&variable, &value);
    (Déja, c'est étrange non de mettre &value: ça signifie l'adresse du pointeur si je ne m'abuse, alors qu'il faut juste un pointeur... bref, je suis perdu! )

    Ce code est censé lire le texte de la forme suivante:
    Bon quand je compile, j'ai des warning format... et puis de toute manière, quand je débug et que je regarde mes variables, et bien ça ne contient pas ce que ça doit contenir.

    Pourtant ce code est tiré de la doc GnuGcc, mais là, je sèche.

    Quelqu'un à -t-il une idée?

  2. #2
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut
    Bonsoir,

    Dans le man du scanf il est précisé que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    %a    Indique  que  la  conversion  sera  de  type  s, la
          mémoire nécessaire pour la chaine sera allouée avec
          malloc(3) et le pointeur sera assigné à la variable
          de type char qui n'a pas besoin d'être  initialisée
          auparavant.  Cet attribut n'existe pas en C ANSI.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    BUGS
           Toutes ces fonctions  sont  totalement  conformes  à  ANSI
           C3.159-1989,  mais lui ajoutent les attributs q et a ainsi
           que des comportements supplémentaires des attributs  L  et
           l.   Ce  derniers  doivent être considérés comme des bugs,
           car ils modifient le comportement d'attributs définis dans
           ANSI C3.159-1989.
    A mon avis, tu devrais éviter d'utiliser cette fonctionnalité. Même en ajoutant "-std=c99" à la compilation, gcc me sort
    warning: format ‘%a’ expects type ‘float *’, but argument 2 has type ‘char *’
    qui ne présage rien de bon !

    Je te conseil d'utiliser la fonction fgets qui permet de faire une saisie jusqu'au retour chariot et de limiter le nombre de caractères saisis. man fgets.

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 474
    Par défaut
    Citation Envoyé par morpheusmg Voir le message
    (Déja, c'est étrange non de mettre &value: ça signifie l'adresse du pointeur si je ne m'abuse, alors qu'il faut juste un pointeur... bref, je suis perdu! )
    C'est normal : les pointeurs recevant les adresses des blocs alloués sont passés par paramètre à la fonction. Il faut donc passer l'adresse des pointeurs eux-mêmes pour que scanf() puisse y déposer les adresses des blocs.

    Par contre, %as ou %a[] est une extension GNU. Sur quel système travailles-tu ? Si c'est sur un Linux, montre-nous les warnings en question.

    EDIT : par contre, gérer les retour à la ligne avec scanf(), c'est pénible parce la fonction les considère comme des blancs. Donc un ou plusieurs espaces séparateurs dans ton expression incluront ces retours à la ligne si elle en rencontre. Il faut donc mettre un espace en début d'expression pour gérer le cas où il y a effectivement des blancs en début de ligne, mais pas du tout à la fin car tous les blancs surnuméraires seront ramassés, certes, mais le retour à la ligne aussi. Le buffer étant vide, scanf() entre en mode bloquant car il est possible que d'autres blancs soient à venir. On croit alors que la boucle a fait un tour et que l'on est prêt à lire une nouvelle entrée, mais ce n'est pas le cas.

    Citation Envoyé par Elijha Voir le message
    A mon avis, tu devrais éviter d'utiliser cette fonctionnalité. Même en ajoutant "-std=c99" à la compilation, gcc me sort […]qui ne présage rien de bon !
    Ce n'est pas la même chose : dans le cas de %s ou de %[], « a » est un préfixe demandant l'allocation automatique. Par contre, %a est un autre modificateur, qui n'a rien à voir et qui est synonyme de %f.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 59
    Par défaut
    Bonjour!!!
    Tout d'abord merci de vos réponses!!
    Dès que j'aurais accès à mon PC, je vous enverrais les warnings (ce soir ou demain soir!)

    Juste en attendant:

    Par contre, %as ou %a[] est une extension GNU. Sur quel système travailles-tu ? Si c'est sur un Linux, montre-nous les warnings en question.
    Je suis sous linux, et effectivement j'utilise GCC

    Et merci pour le conseil sur la fonction scanf: c'est une fonction très complexe je trouve! (parole de débutant! )

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 59
    Par défaut
    Hello tous le monde!
    Alors voici les warnings:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /main.c:67: attention : format ‘%a’ expects type ‘float *’, but argument 2 has type ‘char **’
    /main.c:67: attention : format ‘%a’ expects type ‘float *’, but argument 3 has type ‘char **’
    et je rappel juste ma ligne de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *variable,*value;
    scanf ("%a[a-zA-Z0-9] = %a[^\n]\n",&variable, &value);
    Voici le code donné en exemple dans la doc de gcc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    {
      char *variable, *value;
      if (2 > scanf ("%a[a-zA-Z0-9] = %a[^\n]\n",
                     &variable, &value))
        {
          invalid_input_error ();
          return 0;
        }
      ...
    }
    Comme quoi, j'ai vraiment suivi l'exemple de la doc!

    En tout cas merci de me donner de votre temps

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 474
    Par défaut
    %a[] et %as sont des extensions propres à GNU et elles ne seront pas prises en compte si tu compiles dans un environnement trop proche de la norme, à moins de dire explicitement au compilo que c'est un programme GNU. C'est d'ailleurs indiqué dans la man page (sur ma machine, en tout cas) :

    Citation Envoyé par man 3 scanf
    Le modificateur a n’est pas disponible si le programme a été compilé avec gcc -std=c99 ou gcc -D_ISOC99_SOURCE (à moins que _GNU_SOURCE n’ait également été indiqué), auquel cas a
    est interprété comme un spécificateur de nombres en virgule flottante (voir plus haut).

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 59
    Par défaut
    @ Obsidian: Un grand merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Autre] scanf avec SDL/C ?
    Par elhadiDZ dans le forum SDL
    Réponses: 9
    Dernier message: 19/05/2013, 21h15
  2. Réponses: 1
    Dernier message: 15/10/2010, 14h04
  3. problème avec les flags
    Par minibus dans le forum Débuter
    Réponses: 6
    Dernier message: 16/08/2009, 21h09
  4. [Débutant]Fonction avec des flags
    Par @r$£~%[ dans le forum C++
    Réponses: 10
    Dernier message: 22/08/2005, 10h19
  5. PB avec scanf
    Par ché dans le forum C
    Réponses: 6
    Dernier message: 13/08/2003, 07h25

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