Problème de code en C

Bonjours, en suivant le tuto sur le langage C du sdz on me demande de créer un questionnaire qui demande l'age,le nom,ect a partir de 2 utilisateurs a partir d'une structure que j'ai créer. Problème: les questions ne s'enchaîne pas, je dois taper un lettre après avoir répondu a un scanf pour pouvoir continuer et a partir de la 3ème question ça met des valeurs aléatoire :(. Pourriez vous me dire où est mon erreur plz? :)

Mon code de la structure: (main.h)

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

typedef struct User User;// allias pour éviter de devoir retaper struct
struct User // ma struct perso sous forme en autre de tableau
{
    char nom[100];
    char prenom[100];
    char adresse[1000];

    int age;
    int sex;// Booléen : 1= graçon, 0 = fille
};


celui du main.c:

#include "main.h" // Inclusion du .h qui contient les prototypes et structures
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    User player[2];// définis que je veux poser les question a 2 utilisateurs
    int i = 0;

    for(i=0;i<2;i++)// boucle pour ne pas devoir retaper mon code
    {
        printf("Veuillez entrer votre nom: ");
        scanf("%s\n",&player[0].nom);
        printf("Veuillez entrer votre prenom: ");
        scanf("%s\n",&player[0].prenom);
        printf("veuillez entrer votre adresse: ");
        scanf("%s\n",&player[0].adresse);
        printf("veuillez entrer votre age: ");
        scanf("%d\n",&player[0].age);
        printf("veuillez entrer votre sex ");
        scanf("%d\n\n",&player[0].sex);
        printf("Votre nom est: %s, votre prénom est: %s, votre adresse est: %s, Votre age est de: %d ans et vous etes du sex: %d\n",player[0].nom,player[0].prenom,player[0].adresse,player[0].age,player[0].sex);// récapitulatif des infos collectées
    }
}

2 réponses

  • Votes
  • Date
  • Date décroissante
  1. Je vois plusieurs erreurs :

    - tu lis les données deux fois mais tu stocke tout dans player[0], ça devrait plutôt être player[i] (pareil pour le printf à la fin)

    - il ne faut pas mettre de '\n' dans le format de scanf, sinon il attend une ligne supplementaire (donc il faut appuyer 2 fois sur entrée)

    - le plus grave : les variables de type char[] sont déjà des pointeurs donc il ne faut pas mettre le & : scanf("%s", player[i].nom) - ça c'est vrai pour les chaines, pas pour les nombres (scanf("%d", &player[i].age est correct)

    (bon d'accord les pointeurs en C c'est compliqué, mais faut pas se décourager, tout le monde s'est cassé les dents dessus avant de comprendre :)

    enfin, un truc à savoir : scanf c'est bien pour s'amuser mais en vrai c'est TRES dangereux (un petit malin peut faire toute sortes de choses en entrant des données incorrectes, comme un nom de plus de 100 caractères par exemple). Le problème c'est qu'il n'existe pas de solution portable, donc là ça dépend du compilateur et de la plateforme...
    1. Merci :) je vais corriger tout ça. Bah le problème c'est pas tant de comprendre les pointeurs mais de retenir ^^ je vais me faire une petite fiche je crois. Sinon pour le scanf quelle autre option y a-t-il? Je suis sous l'IDE code::block (13.12).
    2. Au fait ma boucle for a un autre soucis je crois. Je voudrais qu'il enregistre les données pour 2 personnes différentes. Il faudrait donc que je demander toutes le infos une fois qui seront consignée dans deux" User player[]" je dois créer un autre boucle par dessus ma boucle?
    3. Non non, tu as bien deux personnes différentes :
      player[0]
      player[1]

      (si tu suis la première remarque de alfredeneumeuh)
    4. Merci les potes :) je m'occupe de ça se soir.
  2. vous devez changer player[0] par player[i] comme ça vous pouvez stockez les donnez des deux joueurs
    en plus pour stockez les caractères nom et prénom adresse du joueur c'est pas la paine d'etulisez "&" car les champs ( player[0].nom,player[0].prenom,player[0].adresse)sont les noms des tableaux(pointeurs
    et pour stockez les char des chaines de caractere c'est mieux d'etuliser la fonction gets(par exemple gets(player[i].nom)
    1. Bonjour
      Une précision avant de lire encore et encore de la confusion entre pointeurs et tableaux.

      1-Un tableau et une zone mémoire pouvant accueillir N éléments de type correspondant aux tableaux
      2->Un pointeur est une zone mémoire qui contient l'adresse d'une autre zone mémoire.

      Si tous les deux éléments présentent un principe d'accès apparenté au pointeur ce n'est pas la même chose en déclarant
       char cInfo[]= "BONJOUR";
      cala veut dire que l'en crée un tableau de type char de 8 caractères qui est totalement différents de
      char *pInfo;

      l'utilisation abusive de ces termes fausse la compréhension du principe pointeur et tableaux.
    2. Contributeur
      siham CPGE,

      et pour stockez les char des chaines de caractere c'est mieux d'etuliser la fonction gets(par exemple gets(player[i].nom)
      N'importe quoi ! gets() est obsolète et ne doit jamais être utilisé. gets() est aussi dangereux qu'un scanf() mal utilisé... Il vaut mieux utiliser fgets()... Ou alors bien savoir utilisé scanf().
      Un petit lien :
      http://fiddy.free.fr/blog/index.php?post/2008/11/22/Le-C,-pas-si-facile-que-%C3%A7a