2013-04-30 55 views
1

編寫一個使用循環顯示「名稱」「e1」「e2」「e3」「」e4「」avg「和」grade「的小圖的函數。在函數中,我無法打印存儲在「名稱」數組中的元素。在循環中打印字符串數組

這是其全部功能:

void display(stuff *everything) 
{  
int q = 0; 

printf("\n\n Name \t\t E1 \t E2 \t E3 \t E4 \t Avg \t Grade"); 
for(q=0; q<13; q++) 
{ 
printf("\n %s \t %d \t %d \t %d \t %d \t %.2f \t %c", 
everything[q].names[q], 
everything[q].scores[0], 
everything[q].scores[1], 
everything[q].scores[2], 
everything[q].scores[3], 
everything[q].average, 
everything[q].letter); 
} 
return; 
} 

一切都從這樣的:

typedef struct structure 
{ 
char names[20]; 
int scores[4]; 
float average; 
char letter; 
} stuff; 

一旦你主要是;

stuff everything[13]; 
int i=0; 
int j=0; 
int a=0; 
FILE *student, *score; 
student = fopen("student.dat", "r"); 
score = fopen("scores.dat", "r"); 

名稱填充像這樣:

for(a=0; a<13; a++) 
{ 
fscanf(student, "%s", &everything[a].names[a]); 
} 
fclose(student); 

這是函數調用:

display(everything); 

它編譯罰款,但在運行它時,我得到一個分段錯誤。經過一些測試後,我或多或少地發現它來自函數中的%s,我不知道如何解決它。幫幫我?

+1

這行看起來很可疑fscanf(學生,「%s」,&一切[a] .names [a]);'' – Duck 2013-04-30 00:48:28

回答

3

,需要修改讀取代碼如下:

for(a=0; a<13; a++) 
{ 
    fscanf(student, "%19s", everything[a].names); 
} 
fclose(student); 

「名」是一個字符數組。它可以容納一個字符串。當調用scanf時,不需要使用&符號,因爲數組在傳遞給函數時會「衰減」指針。添加下標[a]也是一個錯誤。同樣適用於打印。

單獨注意scanf中的格式字符串:我加了19以避免溢出20個字符的緩衝區(您需要一個額外的字符以實現空終止)。

0

everything[q].names[q]everything[q].names,因爲目的是爲了寫入字符串(對於該printf()需要names字符串的地址),而不是字符串在由字符串的第q信的值指出。