Partage
  • Partager sur Facebook
  • Partager sur Twitter

Scanf et enum

Sujet résolu
    20 avril 2006 à 19:24:50

    Bonjour.

    J'ai quelques petits problèmes pour trouver ce qu'il me faut.

    typedef enum Sexe Sexe;
    enum Sexe
    {
        masc,fem
    };


    Puis,

    fprintf(fichier,"%s\n%d\n%s",name,age,sexe);[


    Seulement %s ca va pas trop bien pour mon type "Sexe" :/
    Donc comment recuperer le contenu de la var "sexe" de type "Sexe" sans se taper un (null) ou 0 ?
    J'ai testé un peu au hasard, rien trouvé.

    Merci pour l'aide apportée..

    Maldrus.
    • Partager sur Facebook
    • Partager sur Twitter
      20 avril 2006 à 19:28:59

      A la limite tu peux faire un %d car au final ici masc vaut 0 et fem vaut 1. Si le compilo t'embetes tu castes ...,age,(int)sexe)

      Je préviens : je ne sais pas si c'est propre ou pas. C'est faisable comme ça.
      • Partager sur Facebook
      • Partager sur Twitter
        20 avril 2006 à 19:31:44

        Mwais caca après, mais bidouillable :]

        Marci jvais me contenter de ca =)
        • Partager sur Facebook
        • Partager sur Twitter
          20 avril 2006 à 19:34:46

          Tu n'as pas vraiment le choix tu sais.
          Les enums te rendent le code plus propre mais si tu veux en avoir une version humainement compréhensible il te faudra passer par des fonctions du genre :
          char * toString(Sexe s);
          et Sexe fromString(const char * s);
          • Partager sur Facebook
          • Partager sur Twitter
            20 avril 2006 à 19:35:47

            Ou évite scanf parce que ce f est bien une mauvaise chose.

            Essaye avec getchar ou fgetc.
            • Partager sur Facebook
            • Partager sur Twitter
              20 avril 2006 à 19:43:04

              Pourquoi scanf est-il une mauvaise chose ? oO

              Kayl > Noté. Merci de l'info.
              • Partager sur Facebook
              • Partager sur Twitter
                20 avril 2006 à 20:00:30

                Il est source d'erreur, quasiment totalement insécurisé. Cela vient en partie du f qui signifie formaté (formated).

                Lorsqu'une des conversions échoue, la fonction stoppe brutalement et entraîne un comportement indeterminé que bien des programmeurs ont regretté.

                Bien que la fonction renvoie le nombre de conversions effectuées correctement et qu'un contrôle précaire de saisie puisse être fait ("%xs"), mieux vaut la remplacer définitivement par l'un de ses équivalents (à savoir la fonction fgetc, fgets pour les chaînes et la macro getchar).

                Voilà. :)

                ++.
                • Partager sur Facebook
                • Partager sur Twitter
                  20 avril 2006 à 20:09:58

                  Merci de l'info aussi, c'est noté ;).
                  • Partager sur Facebook
                  • Partager sur Twitter
                    20 avril 2006 à 23:54:22

                    Citation : maldrus


                    typedef enum Sexe Sexe;
                    enum Sexe
                    {
                        masc,fem
                    };



                    Puis,

                    fprintf(fichier,"%s\n%d\n%s",name,age,sexe);[



                    Seulement %s ca va pas trop bien pour mon type "Sexe" :/
                    Donc comment recuperer le contenu de la var "sexe" de type "Sexe" sans se taper un (null) ou 0 ?


                    Tu veux transformer un enum en texte ? Il n'y a pas de moyens direct intégrés au langage C, et c'est regrettable.

                    <C avancé>
                    Mais si on connait bien le préprocesseur, il y a des astuces. Ma CLIB en est truffée (les fichiers .itm sont la clé).
                    http://mapage.noos.fr/emdel/clib.htm

                    Si ça t'interesse, je peux détailler... C'est un peu chaud, mais pas trop... (disons 3/5)
                    </C avancé>
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Music only !
                      21 avril 2006 à 9:40:42

                      Effectivement un peu chaud, je vais me contenter du cast + bidouillage pour le moment, car je suis un peu perdu dans ta CLIB.. ^^

                      Merci quand même ;)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        21 avril 2006 à 10:11:42

                        Citation : maldrus

                        je vais me contenter du cast + bidouillage pour le moment,


                        cast, bidouille ? Non. Il faut définir un tableau de chaines dont les indices sont la valeur des enums et le contenu les textes correspondants.

                        enum Sexe
                        {
                           masc, /* [0] */
                           fem   /* [1] */
                        };

                        static char const *as_sexe[] =
                        {
                           "masc", /* [0] */
                           "fem"   /* [1] */
                        };

                        <...>

                          printf ("%s\n", as_sexe[masc]);
                          printf ("%s\n", as_sexe[fem]);


                        La manip que je suggérais (à base de macros) permet de créer automatiquement le enum et le tableau de chaines à partir d'un fichier de definition unique... (le fameux .itm...)

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Music only !

                        Scanf et enum

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown