我有一個任務,並遇到了一些障礙。下面的代碼應該從文件中獲取輸入,並將其讀入我已定義的結構中,並且不會限制輸入行的數量。然而,出現segfaults在線路:使用fscanf將數據輸入到動態結構指針數組中?
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 }
我測試之前的代碼,雖然在這一點上我使用靜態數組和想改變爲動態大小。但是,除了行號之外,即使gdb也只提供很少的幫助。我是否需要單獨malloc每個學生結構,還是我錯過了一些完全不同的東西?
S[i] = (student *)malloc(sizeof(student));
所以這似乎已經解決了這一問題:
編輯:當我在while循環通過分配內存給每個學生看來代碼工作。我會運行一些測試來確保。
這看起來像一個奇怪的鏈接列表\二維數組。你要哪個? – andre 2013-02-22 20:22:23
你能解釋輸入行的格式嗎? '「%d%[^,],%s%f」'你爲什麼用''''做這個? – 2013-02-22 20:24:24
安德烈,那是一個疏忽,我很抱歉。我早些時候嘗試了LL方法,但發現它不是我所需要的。 @AdriánLópez輸入數據的格式爲,。我只是使用掃描集來擺脫逗號。我很抱歉沒有提及! –
user991710
2013-02-22 20:26:17