Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème sur un test avec les structures

Sujet résolu
    18 avril 2006 à 14:15:34

    bonjour,
    je suis en train de faire un test avec les structures.
    Quand j'entre quelque chose avec un espace ça saute la prochaine fois qu'il faut entrer quelque chose. C'est dure à expliquer voi-si mon code.
    #include <stdio.h>
    #include <stdlib.h>


    int main(int argc, char *argv[])
    {
        typedef struct CarteIdentite CarteIdentite;
        struct CarteIdentite
        {
            char prenom[100];
            char nom[100];
            char adresse[100];
            char ville[100];
            long codePostal;
            char sexe;
            int garcon; //1 pour garçon et 0 pour fille
        };

        CarteIdentite Inconnue;

        //Demandons toutes les informations que l'on peut récupérer avec Inconnue
        printf("Entrez votre Prenom : ");
        scanf("%s",Inconnue.prenom);

        printf("Entrez votre Nom : ");
        scanf("%s",Inconnue.nom);

        printf("Entrez votre Adresse : ");
        scanf("%s",Inconnue.adresse);

        printf("Entrez votre Ville : ");
        scanf("%s",Inconnue.ville);

        printf("Entrez votre Code Postal : ");
        scanf("%ld",Inconnue.codePostal);

        printf("Entrez votre sexe(1 = masculin, 2 = feminin) : ");
        scanf("%ld",Inconnue.garcon);
        printf("\n");

        if(Inconnue.garcon)
          Inconnue.sexe = "masculin";
        else
          Inconnue.sexe = "féminin";

        printf("Vous vous appelez %s %s, vous êtes de sexe %s.", Inconnue.nom, Inconnue.prenom, Inconnue.sexe);
        printf("Vous habitez au %s %dl %s.", Inconnue.adresse, Inconnue.codePostal, Inconnue.ville);
    }
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      18 avril 2006 à 14:17:29

      printf("Entrez votre Code Postal : ");
      scanf("%ld",Inconnue.codePostal);
      printf("Entrez votre sexe(1 = masculin, 2 = feminin) : ");
      scanf("%ld",Inconnue.garcon);

      Hem... et les & ?
      Sinon je ne crois pas qu'il faut déclarer les structures dans une fonction...
      Sinon pour les espaces, pour scanf les espaces sont des délimitateurs, essaye plutot fgets avec stdin
      • Partager sur Facebook
      • Partager sur Twitter
        18 avril 2006 à 14:21:10

        Citation : http://dpobel.free.fr/man/html/affiche_man.php/3138/man/scanf/

        %s Correspond à une séquence de caractères différents
        des caractères blancs. Le pointeur correspondant
        doit être du type char *, et la chaine doit être
        assez large pour accueillir toute la séquence,
        ainsi que le caractère NUL final. La conversion
        s'arrête au premier caractère blanc, ou à la
        longueur maximale du champ.



        Donc accueille fgets(char * s, int size, stdin) dans ta vie si tu veux pouvoir rentrer simplement une chaine avec des espaces dans UNE variable.
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          18 avril 2006 à 14:22:52

          gets?!!!!!!!!!!! t'es fou toi! et si l'utilisateur rentre trop de lettres?
          • Partager sur Facebook
          • Partager sur Twitter
            18 avril 2006 à 14:23:48

            Super meme pas le temps d'editer qu'on me tape...

            Et pourquoi tu ne lui as pas tapé dessus lors de ses scanf %s sans taille de champ ?? Même problème, même combat.
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              18 avril 2006 à 14:24:57

              Ho désolé... c'est quand j'ai vu le monstre (gets) j'ai pris peur
              Ha oui en effet pour les %s sans taille c'est pas bon aussi mais cmme je lui ai conseillé d'utiliser fgets après...
              • Partager sur Facebook
              • Partager sur Twitter
                18 avril 2006 à 14:33:11

                parcequ'on peut mettre des tailles de champs, comment?
                • Partager sur Facebook
                • Partager sur Twitter
                  18 avril 2006 à 14:35:40

                  Citation : http://dpobel.free.fr/man/html/affiche_man.php/3138/man/scanf/

                  En plus de ces attributs peut se trouver un champ option­nel de longueur maximale, exprimée sous forme d'entier, entre le caractère % et l'indicateur de conversion.



                  Mais utilise fgets de toute façon sinon tu n'auras pas de nom espacés.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 avril 2006 à 14:36:12

                    parcontre j'ai du mal à comprendre comment utiliser fgets. Pourriez-vous donner un petit exemple s'il vous plait?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 avril 2006 à 14:36:46

                      fgets(prenom,100,stdin);
                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 avril 2006 à 14:39:54

                        et comment je récupère se que l'utilisateur écrit?
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          18 avril 2006 à 14:42:15

                          ben c'est stocké dans la chaîne prenom
                          • Partager sur Facebook
                          • Partager sur Twitter
                            18 avril 2006 à 15:03:14

                            mon code ne marche toujours pas
                            #include <stdio.h>
                            #include <stdlib.h>


                            int main(int argc, char *argv[])
                            {
                                typedef struct CarteIdentite CarteIdentite;
                                struct CarteIdentite
                                {
                                    char prenom[100];
                                    char nom[100];
                                    char adresse[100];
                                    char ville[100];
                                    long codePostal;
                                    char sexe[9] = "féminin";
                                    int garcon; //1 pour garçon et 0 pour fille
                                };

                                CarteIdentite Inconnue;

                                //Demandons toutes les informations que l'on peut récupérer avec Inconnue
                                printf("Entrez votre Prenom : ");
                                fgets(Inconnue.prenom, 100, stdin);

                                printf("Entrez votre Nom : ");
                                fgets(Inconnue.nom, 100, stdin);

                                printf("Entrez votre Adresse : ");
                                fgets(Inconnue.adresse, 100, stdin);

                                printf("Entrez votre Ville : ");
                                fgets(Inconnue.ville, 100, stdin);

                                printf("Entrez votre Code Postal : ");
                                scanf("%ld",&Inconnue.codePostal);

                                printf("Entrez votre sexe(1 = masculin, 0 = feminin) : ");
                                scanf("%ld",&Inconnue.garcon);
                                printf("\n");

                                if(Inconnue.garcon)
                                {
                                    long i;
                                    char masculin[] = "masculin";

                                    for(i = 0; i < 9; i++)
                                    {
                                      Inconnue.sexe[i] = masculin[i];
                                    }
                                }

                                printf("Vous vous appelez %s %s, vous êtes de sexe %s.", Inconnue.nom, Inconnue.prenom, sexe);
                                printf("Vous habitez au %s %dl %s.", Inconnue.adresse, Inconnue.codePostal, Inconnue.ville);
                            }
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Anonyme
                              18 avril 2006 à 15:05:13

                              Ta variable "sexe" n'est pas déclarée, si?
                              Après, ça:
                                      for(i = 0; i < 9; i++)
                                      {
                                        Inconnue.sexe[i] = masculin[i];
                                      }

                              très moyen, utilise strcpy
                              printf("Vous habitez au %s %dl %s.", Inconnue.adresse, Inconnue.codePostal, Inconnue.ville);

                              %dl ? un nouveau type de variable standard et on m'a pas prévenu!
                              • Partager sur Facebook
                              • Partager sur Twitter
                                18 avril 2006 à 15:09:30

                                #include <stdio.h>
                                #include <stdlib.h>
                                    typedef struct CarteIdentite CarteIdentite;
                                    struct CarteIdentite
                                    {
                                        char prenom[100];
                                        char nom[100];
                                        char adresse[100];
                                        char ville[100];
                                        long codePostal;
                                        char sexe[9];
                                        int garcon; //1 pour garçon et 0 pour fille
                                    };



                                int main(int argc, char *argv[])
                                {

                                    CarteIdentite Inconnue;

                                    //Demandons toutes les informations que l'on peut récupérer avec Inconnue
                                    printf("Entrez votre Prenom : ");
                                    fgets(Inconnue.prenom, 100, stdin);

                                    printf("Entrez votre Nom : ");
                                    fgets(Inconnue.nom, 100, stdin);

                                    printf("Entrez votre Adresse : ");
                                    fgets(Inconnue.adresse, 100, stdin);

                                    printf("Entrez votre Ville : ");
                                    fgets(Inconnue.ville, 100, stdin);

                                    printf("Entrez votre Code Postal : ");
                                    scanf("%ld",&Inconnue.codePostal);

                                    printf("Entrez votre sexe(1 = masculin, 0 = feminin) : ");
                                    scanf("%ld",&Inconnue.garcon);
                                    printf("\n");

                                    if(Inconnue.garcon)
                                        strcpy(Inconnue.sexe,"masculin");
                                    else
                                      strcpy(Inconnue.sexe,"féminin");

                                    printf("Vous vous appelez %s %s, vous êtes de sexe %s.", Inconnue.nom, Inconnue.prenom, Inconnue.sexe);
                                    printf("Vous habitez au %s %dl %s.", Inconnue.adresse, Inconnue.codePostal, Inconnue.ville);
                                }



                                Je te laisse regarder sur le forum comment cleaner un fgets pour virer le \n.

                                Edit : j'ai pas regardé le code dans le détail, juste fait en sorte qu'il compile.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Anonyme
                                  18 avril 2006 à 15:11:21

                                  Au fait à propos de fgets, il laisse rien dans le buffer?
                                  (mais encore ce %dl ! à quoi correspond-t-il?)
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    18 avril 2006 à 15:13:47

                                    Citation : Kayl

                                    fgets(prenom,100,stdin);


                                    fgets (prenom, sizeof prenom, stdin);


                                    Citation : Ze moi

                                    Au fait à propos de fgets, il laisse rien dans le buffer?


                                    Non, si il n'y a pas eu saturation (mais attention, le '\n' est là aussi. Il peut géner). Sinon, tout ce qui n'a pas été lu est encore dans stdin.

                                    C'est pourquoi je recommande le nettoyage après chaque fgets() :


                                    #include <stdio.h>
                                    #include <string.h>

                                    void clean (char *s, FILE *fp)
                                    {
                                       /* search ... */
                                       char *p = strchr (s, '\n');
                                       if (p != NULL)
                                       {
                                          /* ... and kill */
                                          *p = 0;
                                       }
                                       else
                                       {
                                          /* purge */
                                          int c;
                                          while ((c = fgetc(fp)) != '\n' && c != EOF)
                                          {
                                          }
                                       }
                                    }

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Music only !
                                      18 avril 2006 à 15:14:46

                                      Citation : -ed-

                                      Citation : Kayl

                                      fgets(prenom,100,stdin);


                                      fgets (prenom, sizeof prenom, stdin);




                                      En effet, bcp moins chiant à modifier :) Au temps pour moi alors.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Anonyme
                                        18 avril 2006 à 15:21:03

                                        dans ta fonction clean, pour le FILE, on met stdin?
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          18 avril 2006 à 15:48:30

                                          Citation : patxiku

                                          mon code ne marche toujours pas


                                          • On ne peut pas mettre d'initialisation dans une définition de structure.
                                          • Pour copier une chane, il vaut lieux utiliser strcpy(). Mais ici, s'agissant de chaines, il suffit d'un pointeur sur la bonne chaine...
                                          • Il faut éviter de surcharger la structure avec des champs inutiles ou trop grands...

                                          Secret (cliquez pour afficher)

                                          #include <stdio.h>
                                          #include <stdlib.h>
                                          #include <string.h>

                                          typedef struct
                                          {
                                             char prenom[32];
                                             char nom[32];
                                             char adresse[128];
                                             char ville[32];
                                             long codePostal;
                                             int garcon; //1 pour garçon et 0 pour fille
                                          }
                                          CarteIdentite;

                                          static void clean (char *s, FILE *fp)
                                          {
                                             /* search ... */
                                             char *p = strchr (s, '\n');
                                             if (p != NULL)
                                             {
                                                /* ... and kill */
                                                *p = 0;
                                             }
                                             else
                                             {
                                                /* purge */
                                                int c;
                                                while ((c = fgetc(fp)) != '\n' && c != EOF)
                                                {
                                                }
                                             }
                                          }

                                          int main(int argc, char *argv[])
                                          {
                                             CarteIdentite Inconnue;
                                             //Demandons toutes les informations que l'on peut récupérer avec Inconnue
                                             printf("Entrez votre Prenom : ");
                                             fflush (stdout);
                                             fgets(Inconnue.prenom, sizeof Inconnue.prenom, stdin);
                                             clean(Inconnue.prenom, stdin);

                                             printf("Entrez votre Nom : ");
                                             fflush (stdout);
                                             fgets(Inconnue.nom, sizeof Inconnue.nom, stdin);
                                             clean(Inconnue.nom, stdin);

                                             printf("Entrez votre Adresse : ");
                                             fflush (stdout);
                                             fgets(Inconnue.adresse, sizeof Inconnue.adresse, stdin);
                                             clean(Inconnue.adresse, stdin);

                                             printf("Entrez votre Ville : ");
                                             fflush (stdout);
                                             fgets(Inconnue.ville, sizeof Inconnue.ville, stdin);
                                             clean(Inconnue.ville, stdin);

                                             {
                                                int n;
                                                do
                                                {
                                                   printf("Entrez votre Code Postal : ");
                                                   fflush (stdout);
                                                   {
                                                      char s[8];
                                                      fgets(s, sizeof s, stdin);
                                                      clean(s, stdin);
                                                      n = sscanf(s, "%ld", &Inconnue.codePostal);
                                                   }
                                                }
                                                while (n != 1 || Inconnue.codePostal > 99999);
                                             }

                                             {
                                                int n;
                                                do
                                                {
                                                   printf("Entrez votre sexe(1 = masculin, 0 = feminin) : ");
                                                   fflush (stdout);
                                                   {
                                                      char s[8];
                                                      fgets(s, sizeof s, stdin);
                                                      clean(s, stdin);
                                                      n = sscanf(s, "%d", &Inconnue.garcon);
                                                   }
                                                }
                                                while (n != 1 || Inconnue.garcon < 0 || Inconnue.garcon > 1);
                                             }
                                             printf("\n") ;

                                             {
                                                char *sexe;
                                                if (Inconnue.garcon)
                                                {
                                                   sexe = "masculin";
                                                }
                                                else
                                                {
                                                   sexe = "feminin";
                                                }

                                                printf("Vous vous appelez %s %s\n"
                                                       "Vous êtes de sexe %s.\n"
                                                       , Inconnue.nom
                                                       , Inconnue.prenom
                                                       , sexe);
                                             }

                                             printf("Vous habitez au\n"
                                                    " %s\n"
                                                    "%ld %s.\n"
                                                    , Inconnue.adresse
                                                    , Inconnue.codePostal
                                                    , Inconnue.ville);

                                             return 0;
                                          }

                                          Pose des questions si tu ne comprends pas.
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Music only !
                                            18 avril 2006 à 18:51:48

                                            bonjour,
                                            vu le niveau que j'ai en C il y a beaucoup de ces fonctions que je ne comprends pas. Y a-t-il une documentation C comme il y a pour PHP??
                                            Sinon:
                                            • que veut dire et pourquoi on l'utilise
                                              fflush (stdout);
                                            • que veut dire que met-on dans le troisième paramètre de fgets et que veut dire stdin.
                                            • A quoi sert la fonction suivante??
                                              static void clean (char *s, FILE *fp)
                                              {
                                                 /* search ... */
                                                 char *p = strchr (s, '\n');
                                                 if (p != NULL)
                                                 {
                                                    /* ... and kill */
                                                    *p = 0;
                                                 }
                                                 else
                                                 {
                                                    /* purge */
                                                    int c;
                                                    while ((c = fgetc(fp)) != '\n' && c != EOF)
                                                    {
                                                    }
                                                 }
                                              }
                                            • Que signifie les accolades sans avoir de commandes (je crois qu'on dit comme ça) avant tels que : if, elseif ...
                                              Pourquoi est-il nécessaire de faire tout ça??

                                                 {
                                                    int n;
                                                    do
                                                    {
                                                       printf("Entrez votre Code Postal : ");
                                                       fflush (stdout);
                                                       {
                                                          char s[8];
                                                          fgets(s, sizeof s, stdin);
                                                          clean(s, stdin);
                                                          n = sscanf(s, "%ld", &Inconnue.codePostal);
                                                       }
                                                    }
                                                    while (n != 1 || Inconnue.codePostal > 99999);
                                                 }

                                                 {
                                                    int n;
                                                    do
                                                    {
                                                       printf("Entrez votre sexe(1 = masculin, 0 = feminin) : ");
                                                       fflush (stdout);
                                                       {
                                                          char s[8];
                                                          fgets(s, sizeof s, stdin);
                                                          clean(s, stdin);
                                                          n = sscanf(s, "%d", &Inconnue.garcon);
                                                       }
                                                    }
                                                    while (n != 1 || Inconnue.garcon < 0 || Inconnue.garcon > 1);
                                                 }



                                            Je crois que pour l'instant c'est bon.
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              18 avril 2006 à 23:10:49

                                              Citation : patxiku

                                              vu le niveau que j'ai en C il y a beaucoup de ces fonctions que je ne comprends pas. Y a-t-il une documentation C comme il y a pour PHP??


                                              http://www-ccs.ucsd.edu/c/

                                              Citation : patxiku


                                              que veut dire et pourquoi on l'utilise

                                              fflush (stdout);



                                              http://mapage.noos.fr/emdel/notes.htm#fflush_stdout

                                              Citation : patxiku


                                              que veut dire que met-on dans le troisième paramètre de fgets et que veut dire stdin.


                                              Le troisième paramètre est le flux (fichier). stdin est un flux texte ouvert en lecture au démarrage d'une application C. C'est par là que se font les entrées standards (console, par exemple).

                                              http://mapage.noos.fr/emdel/notes.htm#saisie
                                              http://mapage.noos.fr/emdel/notes.htm#fichiers

                                              Citation : patxiku


                                              A quoi sert la fonction suivante??

                                              static void clean (char *s, FILE *fp)
                                              {
                                              <...>
                                              }



                                              A nettoyer la chaine saisie (suppression du '\n' si présent) et à nettoyer stdin après usage (si pas de '\n'). Beaucoup de détails dans les liens ci-dessus. Si malgré tout, tu ne comprends pas, demande des précisions.

                                              Citation : patxiku


                                              Que signifie les accolades sans avoir de commandes (je crois qu'on dit comme ça) avant tels que : if, elseif ...
                                              Pourquoi est-il nécessaire de faire tout ça??


                                              {
                                                 ...
                                              }

                                              Ce sont des blocs. Il faut savoir qu'en C, on ne peut définir une variable qu'au debut d'un bloc[1]. Pour aider à la lisibilité et à la modularisation du code, il est conseillé d'utiliser un technique de codage qui consiste à réduire la portée des variables au minimum. D'où une utilisation massive des blocs. Il s'agit souvent d'un état de code 'intermédiaire (mais fonctionnel) avant la modularisation (mise en fonctions). Une sorte de 'pré-découpage'... Ca parait un peu abstrait au début, mais avec l'expérience, on apprécie la démarche. Il faut un peu de temps.

                                              http://mapage.noos.fr/emdel/notes.htm#portee

                                              -------------
                                              [1] Ce n'est plus vrai en C99 qui autorise de définir une variable n'importe où, mais je déconseille cette pratique.
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                              Music only !
                                                19 avril 2006 à 0:06:30

                                                j'ai lu mais j'ai eu du mal à comprendre car je ne comprend pas se qu'est un flux.
                                                je verrais ça demain car fatiguer on comprend moins bien.
                                                merci de l'aide que vous m'avez apporté et que vou m'apporteriez.
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Anonyme
                                                  19 avril 2006 à 7:55:33

                                                  Ben un flux, si tu as lu la partie sur les fichiers, c'est un FILE qu'on a pas encore refermé avec fclose.
                                                  Pour stdin, stdout et stderr, ce sont des flux automatiques, qu'on a besoin ni d'ouvrir ne de fermer. Comme l'a dit -ed-, stdin, c'est tout ce que tu fais (texte tapé en console...), stdout, c'est tout ce que le programme fait (ce que le programme écrit lui même par exemple), et stderr, c'est les erreurs (si tu as déjà vu, on écrit fréquemment fprintf(stderr, ...); pour signaler une erreur)
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    19 avril 2006 à 11:35:03

                                                    je comprends mieu mais maintenant, qu'est-ce qu'un tampon buffer??
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                    Anonyme
                                                      19 avril 2006 à 11:42:07

                                                      cest stdin, stdout et stderr je crois...
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        19 avril 2006 à 11:45:18

                                                        Bon juste une question débile :
                                                        J'ai vu que -ed- met sizeof chaine à la place de la taille de chaine, sizeof équivaut à strlen(chaine) ??
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          19 avril 2006 à 11:51:38

                                                          Citation : Pierre89

                                                          J'ai vu que -ed- met sizeof chaine à la place de la taille de chaine, sizeof équivaut à strlen(chaine) ??


                                                          Pas du tout.

                                                          • sizeof est un opérateur qui retourne la taille d'un objet en bytes.
                                                          • strlen() est une fonction qui retourné la taille d'une chaine en bytes. Si il s'agit d'un tableau non initialisé, le notion de 'chaine' est inapplicable.

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                          Music only !
                                                            19 avril 2006 à 11:55:04

                                                            Donc en fait sizeof marcherait avec un tableau et pas strlen() ? c'est ça ?
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                            Anonyme
                                                              19 avril 2006 à 12:07:37

                                                              strlen, c'est que pour les char [] initialisés
                                                              (au fait -ed- j'ai raison à propos des flux et tampons?)
                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              problème sur un test avec les structures

                                                              × 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