Problème de code en C
maxidrones
Messages postés
11
Date d'inscription
Statut
Membre
Dernière intervention
-
sambia39 Messages postés 610 Date d'inscription Statut Membre Dernière intervention -
sambia39 Messages postés 610 Date d'inscription Statut Membre Dernière intervention -
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)
celui du main.c:
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:
- Problème de code en C
- Code ascii - Guide
- Code de déverrouillage oublié - Guide
- Code puk bloqué - Guide
- Code activation windows 10 - Guide
- Code blocks - Télécharger - Langages
2 réponses
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...
- 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...
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)
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)
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
l'utilisation abusive de ces termes fausse la compréhension du principe pointeur et tableaux.
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.
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
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
player[0]
player[1]
(si tu suis la première remarque de alfredeneumeuh)
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