Enregistrements
akramdib
Messages postés
8
Statut
Membre
-
[Dal] Messages postés 6122 Date d'inscription Statut Contributeur Dernière intervention -
[Dal] Messages postés 6122 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
j'ai pas pu trouver où elle est la faute que j'ai comis
merci de me guider
voici mon code :
et voici ce que l'IDE m'affiche :

j'ai pas pu trouver où elle est la faute que j'ai comis
merci de me guider
voici mon code :
#include <stdio.h>
#include <stdlib.h>
int i ,n ;
typedef struct etudiant
{
int note[100];
char nom[100];
char prenom[100];
}etudiant;
int main()
{
printf("donner le nombre d'etudiants qui vous allez me donner leurs info : n= ");
scanf("%d",n);
for(i=1;i<=n;i++)
{
printf("quel est le nom d'etudiant %d :",n );
scanf("%s",&etudiant.nom[i]);
printf("quel est le prenom d'etudiant %d :",n );
scanf("%s",&etudiant.prenom[i]);
printf("quel est la note d'etudiant %d :",n );
scanf("%d",&etudiant.note[i]);
}
for(i=1;i<=n;i++)
{
printf("etudiant %d :",n);
printf("Nom:%s",etudiant.nom);
printf("Prenom:%s",etudiant.prenom);
printf("La Note :%s",etudiant.note);
}
return 0;
}
et voici ce que l'IDE m'affiche :
Configuration: Windows / Chrome 74.0.3729.169
1 réponse
-
Bonjour akramdib,
Il y a plusieurs problèmes dans ton code. La cause première de l'erreur est que tu ne déclares pas une variable "etudiant", mais juste un type "etudiant", avec l'instructiontypedef
, ce type étant un alias du typestruct etudiant
que tu as définit et donc, tu n'as pas de mémoire allouée permettant un stockage que quoi que ce soit, juste la création de types.
Pour déclarer un étudiant en utilisant ce type, il faudrait écrire, par exemple :etudiant etud1;
et à ce moment là, tu réserves de la mémoire pour stocker des choses dans les membres de lastruct
avec la variableetud1
.
Il y a des confusions au niveau des valeurs passées en arguments de tesscanf()
, qui attend des pointeurs. Sin
est unint
alors tu dois passer un pointeur surn
, doncscanf("%d", &n);et passcanf("%d", n);...
Par contre, lorsque tu veux traiter une chaîne de caractères, l'identifiant de la chaîne déclarée pointe déjà vers l'adresse mémoire du début de l'espace réservé à la chaîne. Donc si tu as un tableau de 100char
déclaré commechar nom[100];
, qui est un espace mémoire pouvant accueillir une chaîne de 99 caractères au maximum (plus de'\0'
qui termine la chaîne), il suffit de fairescanf("%s", nom);et tu n'as pas besoin de précéder le nom de&
...
Ce qui m'amène à la dernière série de problèmes. Untypedef
sur unestruct
comme :
typedef struct etudiant { int note[100]; char nom[100]; char prenom[100]; } etudiant;
est un type qui permet de stocker :
- un tableau de 100 notes avec le membre "note"
- une chaîne de 99 caractères avec le membre "nom"
- une chaîne de 99 caractères avec le membre "prenom"
Si tu veux un tableau de 100 étudiants, avec chacun 1 note, 1 nom et 1 prénom, cela ne sert à rien de réserver un espace pour un tableau de 100 notes de cet étudiant... sauf si tu veux stocker 100 notes pour chacun des 100 étudiants...
Pour faire un tableau de 100 étudiants, tu déclarerais :
etudiant etudiants[100];
et tu accèdes aux champs concernant la note du premier étudiant en faisantetudiants[0].note
, à l'adresse réservée pour son nom en faisantetudiants[0].nom
etc.
Dal