Problème de code en C

Fermé
maxidrones Messages postés 11 Date d'inscription jeudi 30 janvier 2014 Statut Membre Dernière intervention 13 février 2014 - 30 janv. 2014 à 11:47
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 - 2 févr. 2014 à 20:10
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
    }
}
A voir également:

2 réponses

alfredeneumeuh Messages postés 9 Date d'inscription mercredi 29 janvier 2014 Statut Membre Dernière intervention 30 janvier 2014 1
30 janv. 2014 à 12:17
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...
0
maxidrones Messages postés 11 Date d'inscription jeudi 30 janvier 2014 Statut Membre Dernière intervention 13 février 2014
30 janv. 2014 à 13:05
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).
0
maxidrones Messages postés 11 Date d'inscription jeudi 30 janvier 2014 Statut Membre Dernière intervention 13 février 2014
30 janv. 2014 à 13:12
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?
0
tinte42 Messages postés 6 Date d'inscription lundi 7 octobre 2013 Statut Membre Dernière intervention 30 janvier 2014
30 janv. 2014 à 13:31
Non non, tu as bien deux personnes différentes :
player[0]
player[1]

(si tu suis la première remarque de alfredeneumeuh)
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
30 janv. 2014 à 13:34
Salut maxidrones,

Pour ta question :

"pour le scanf quelle autre option y a-t-il?"

tu peux lire cette page pour comprendre les difficultés liées à la lecture d'un nombre et disposer de solutions portables : https://faq.cprogramming.com/cgi-bin/smartfaq.cgi?id=1043284385&answer=1043372399

et ce lien pour la lecture d'une ligne de texte : https://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1044652485&id=1043284385


Dal
0
maxidrones Messages postés 11 Date d'inscription jeudi 30 janvier 2014 Statut Membre Dernière intervention 13 février 2014
30 janv. 2014 à 13:57
Merci les potes :) je m'occupe de ça se soir.
0
siham CPGE Messages postés 4 Date d'inscription dimanche 2 février 2014 Statut Membre Dernière intervention 25 février 2014
2 févr. 2014 à 12:33
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
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
2 févr. 2014 à 15:35
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.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
Modifié par fiddy le 2/02/2014 à 17:26
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
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
2 févr. 2014 à 20:10
lol
0