Enregistrements

Fermé
akramdib Messages postés 6 Date d'inscription mercredi 23 janvier 2019 Statut Membre Dernière intervention 28 juin 2019 - Modifié le 28 juin 2019 à 13:31
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 1 juil. 2019 à 15:53
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

1 réponse

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 1 juil. 2019 à 15:56
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
1