J'ai un devoir et j'ai eu un peu de difficulté. Le code suivant est censé prendre l'entrée d'un fichier, le lire dans une structure que j'ai définie et le faire sans aucune limite au nombre de lignes d'entrée. Cependant, il segfaults à la ligne 24 :Utilisation de fscanf pour entrer des données dans un tableau de pointeurs struct struct?
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 typedef struct __student {
6 int ID;
7 char fname[33];
8 char lname[33];
9 float grade;
10 } student;
11
12 void partA(FILE *fp) {
13
14 int i, r;
15 i = r = 0;
16 int N = 1000;
17 student **S;
18
19 S = (student **)malloc(sizeof(student *) * N);
20
21
22 while(!feof(fp)){
23 fscanf(fp, "%d %[^,], %s %f", &S[i]->ID, S[i]->lname, S[i]->fname, &S[i]->grade); // segfault occurs on this line
24 printf("%d %s %s %f\n", S[i]->ID, S[i]->fname, S[i]->lname, S[i]->grade);
25 i++;
26 printf("Something's happening, at least");
27 if(i == N){
28 N *= 2;
29 S = (student **)realloc(S, sizeof(student) * N);
30 if(S == NULL) {
31 printf("Memory reallocation failed; Fatal error.");
32 break;
33 }
34 }
35 }
36 }
Je l'ai testé le code avant, mais à ce moment-là que j'utilisais les tableaux statiques et je voulais passer à une taille dynamique. Cependant, même gdb avec offre très peu d'aide en plus du numéro de ligne. Ai-je besoin de malloc individuellement chaque étudiant struct, ou ai-je manqué quelque chose de complètement différent ici?
EDIT: Il semble que le code fonctionne quand j'allouer de la mémoire à chaque élève dans la boucle while par:
S[i] = (student *)malloc(sizeof(student));
donc qui semble avoir résolu le problème. Je vais faire quelques tests pour être sûr.
Cela ressemble à un tableau impair \ liste de liens \ 2D. Lequel veux-tu? – andre
Pourriez-vous expliquer le format des lignes d'entrée? '"% d% [^,],% s% f "' Pourquoi faites-vous cela avec '',''? –
andre, c'était un oubli, je m'excuse. J'ai essayé une approche LL plus tôt, mais j'ai trouvé que ce n'était pas ce dont j'avais besoin. @ AdriánLópez Les données d'entrée sont au format, . J'utilise simplement un scanset pour me débarrasser de la virgule. Mes excuses pour ne pas mentionner cela! –
user991710