Structure en langage C

Résolu/Fermé
Hanan - 17 févr. 2011 à 12:03
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 19 juin 2014 à 20:04
Bonjour,

j'écris un programme en langage C qui permet de saisir les données des stagiares relatifs aux 28 d'un groupe ,chaque stagiare posséde:-nom -prenom - age -ID - note (d'un module qlqonk ). (en utilisant les structures),mais il ça marche pas, qlq peut m'aider pr savoire ou est le probléme?
le programme:


#include <stdio.h>
int main (){
struct stagiaire{
char nom[20];
char prenom[20];
int age;
char ID[20];
float note;};
struct stagiaire A[28];
int i;


for(i=0;i<28;i++)
{
printf("saisir votre nom \n");
scanf("%s",A[i].nom);
printf("saisir votre prenom \n");
scanf("%s",A[i].prenom);
printf("saiair votre age \n");
scanf("%d",A[i].age);
printf("saisire votre note ");
scanf("%f",A[i].note);

printf("saiair votre ID \n");
scanf("%s",A[i].ID);


}
for(i=0;i<28;i++)
{
printf("%s\t",A[i].nom);
printf("%s\t",A[i].prenom);
printf("%d\t",A[i].age);
printf("%f",A[i].note);
printf("%s",A[i].ID);
return 0;}}

******************
Merci d'avance
A voir également:

14 réponses

Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
17 févr. 2011 à 12:27
attention à bien passer un pointeur ou son équivalent dans la fonction scanf ! ce qui 'nest pas totalement le cas ici.
0
comment ? j'ai pas compris ton idéé
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
17 févr. 2011 à 12:36
Si tu ne comprends pas, c'est que tu ne sais pas utiliser scanf. Je te recommande donc de te renseigner pour savoir comment l'utiliser correctement. (genre un tutoriel)
0
Oui t'as raison quand j'utliser "&" le prog ca marche ,mais notre prof nous a dit que dans les structures c pas necessaire de la mettre!!!!
y t-il des cas vraiment ou on px ne pas mettre "&" dans scanf?ou b1 notre prof est LOCO =D
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
17 févr. 2011 à 12:54
ton prof à tord, et la tu ne passe pas une structure, mais une variable d'un structure.
0
Merci beaucoup pour ton remarque je vais la prendre en consédérable la prochaine fois
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
17 févr. 2011 à 14:04
à vérifier peut être.
ton prof a peu être raison, mais je ne connais pas le comportement de scanf si tu passes une structure. Et que mettre dans la chaine de caractère ?
Une chose est sure, en C++ il aurait tort. Il me semble qu'une structure est une variable à part entière et non une référence. Il est possible d'accéder au différent membres d'une structure ainsi ;
struct {int a;float b;char c[20]} A;
scanf("%d %f",(int*)(&A),(float*)(sizeof(int)+(char*)&A); // si char* est bien de taille 1.
Les cas où il ne fait pas mettre de &, c'est lorsque tu passes un pointeur. Il faut toujours penser au passage par valeur ou par référence/adresse pour comprendre le pourquoi du comment.
0
aah bon un grand merci pour toi
0
il faut que la definition de structure avant main
0
comment?? quelle structure??
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
24 avril 2011 à 00:55
Non narjes, ce n'est pas une obligation. Cela marche très bien en laissant la structure comme il l'a mis. Après, l'utilisation, c'est vrai que ce n'est pas courant...
0
Profil bloqué
24 avril 2011 à 02:01
Merci ;)
0
struct stagiaire{
char nom[20];
char prenom[20];
int age;
char ID[20];
float note;};
struct stagiaire ;
avant le main
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
26 avril 2011 à 21:06
Comme dit précédemment, ce n'est pas une obligation...
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 24/04/2011 à 01:31
Bonjour,
Je confirme les propos de Char Snipeur.
Que ce soit une structure ou pas, l'esperluette (&) est obligatoire pour les types natifs (int, char, double, ...).

Par contre, attention Char Snipeur, si on peut accéder aux différents membres, le compilateur se réserve le droit de réorganiser l'ordre des données.

Et l'accès des données comme tu l'as fait ne risque pas de marcher. Il ne faut surtout pas utiliser de sizeof, un simple cast avec un décalage de 1 suffit pour atteindre le champ suivant.

Cdlt,
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
25 avril 2011 à 23:15
Les réorganisé ?? Jamais entendu parler de ça. Si c'était vraiment le cas, le mix fortran + C ne fonctionnerai pas (COMMON vs. struct), en revanche le compilateur se réserve le droit de les alignés comme il veux. (Ce qui fait que ma "méthode" peut grave merder, mais c'était pour illustré, j'aurai du préciser)
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 25/04/2011 à 23:50
Par réorganiser je voulais plutôt dire alignement (je me souvenais plus du nom).
Mais même s'il n'y avait pas d'alignements, ta "méthode" ne pouvait pas marcher.
Pour se décaler, il ne faut pas de sizeof. L'unité de Si tu veux un exemple, n'hésite pas.l'offset n'est pas le byte.
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
26 avril 2011 à 08:33
Oui, exact, j'ai écrit n'importe quoi.
scanf("%d %f",(int*)(&A),(float*)(1+(int*)&A);
Là ça doit être bon, si l'alignement est celui de base. Merci de la correction fiddy.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
26 avril 2011 à 21:05
Yep, c'est mieux maintenant :-). Il manque juste une petite parenthèse, mais le principal est là.
0