在循环期间打印字符串数组

时间:2013-04-30 00:40:51

标签: c arrays function struct typedef

编写一个使用循环显示“名称”“e1”“e2”“e3”“e4”“avg”和“grade”的小图表的函数。在函数中,我无法打印存储在“names”数组中的元素。

这是完整的功能:

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;

一旦你进入Main;

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,我不知道如何修复它。帮助

2 个答案:

答案 0 :(得分:3)

您应该按如下方式修改阅读代码:

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

“names”是一个字符数组。它可以保持一个字符串。调用scanf时,您不需要使用&符号,因为数组在传递给函数时会“衰减”为指针。添加下标[a]也是一个错误。同样适用于印刷。

另外注意scanf中的格式字符串:我添加了19以避免溢出20个字符的缓冲区(你需要一个额外的字符用于空终止)。

答案 1 :(得分:0)

everything[q].names[q]应为everything[q].names,因为目的是编写字符串(printf()需要names字符串的地址),而不是字符串指向at at字符串的q字母的值。