Enregistrements

Messages postés
6
Date d'inscription
mercredi 23 janvier 2019
Statut
Membre
Dernière intervention
28 juin 2019
-
Bonjour,
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
Afficher la suite 

1 réponse

Messages postés
5243
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
12 octobre 2019
805
0
Merci
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'instruction
typedef
, ce type étant un alias du type
struct 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 la
struct
avec la variable
etud1
.

Il y a des confusions au niveau des valeurs passées en arguments de tes
scanf()
, qui attend des pointeurs. Si
n
est un
int
alors tu dois passer un pointeur sur
n
, donc
scanf("%d", &n);
et pas
scanf("%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 100
char
déclaré comme
char 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 faire
scanf("%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. Un
typedef
sur une
struct
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 faisant
etudiants[0].note
, à l'adresse réservée pour son nom en faisant
etudiants[0].nom
etc.

Dal
Commenter la réponse de [Dal]