C 为什么它只为最后一个循环点的学生输出信息?i、 e.第十九名学生
我想我存储的记忆是正确的C 为什么它只为最后一个循环点的学生输出信息?i、 e.第十九名学生,c,C,我想我存储的记忆是正确的 student *Class; // created an array of 19 total students Class = (student *)malloc(sizeof(Class)* 19 ); //taking in the information for each student Class->first = (char*)m
student *Class; // created an array of 19 total students
Class = (student *)malloc(sizeof(Class)* 19 );
//taking in the information for each student
Class->first = (char*)malloc(sizeof(char)* 19 );
Class->last = (char*)malloc(sizeof(char) * 19 );
Class->exam1 = (int)malloc(sizeof(int) * 19 );
Class->exam2 = (int)malloc(sizeof(int) * 19 );
Class->exam3 = (int)malloc(sizeof(int) * 19 );
在这个循环中,我只看到了第19个学生的信息,如果我除了评论中提到的所有次要问题之外,还更改了“I” 在这两个循环中,带有
scanf()
的循环和带有printf()
的循环,循环变量i
从未使用过。因此,您将所有信息扫描到同一位置,并从同一位置打印20(9)次。
您使用的“位置”非常可疑,您创建它的方式意味着您希望它类似于一个数组。但是如果不使用
i
(或者做一些类似于遍历链表的事情),您只能多次获得相同的值
这就是为什么你只得到最后一个学生的输出
解决方案太复杂,无法在此处修复,至少在没有MRE的情况下,您可以按照这种方式进行修复。所涉及主题的关键词为“数组”、“数据类型”、“指针”、“结构数组”、“数组结构”、“循环”。在所示代码的所有部分中,您仅访问数组的第一个条目。要访问其他条目,请执行
Class[i]。首先,你需要展示学生结构的定义。你不清楚你是在尝试创建一个由数组组成的数组,还是一个由数组组成的数组。看。没错!你不能期望每个人都像你一样思考、做和理解你做的事,除非你告诉我们你做得很好。注意:你只是为每个数组中的19个元素分配存储,但是i
循环会迭代20个元素。如果开始索引这些数组,则索引将超过数组的末尾,并且在该位置对数据的任何读取或写入都将具有未定义的行为。请注意,大小为19的数组的索引为0..18,因此循环应该是<19
.Y我们在一个地方使用<20
,并且您对问题的编辑使事情变得更加奇怪,但实际上并没有改变任何相关的事情。我假设我现在看到int的地方有指针。但至少您的(不必要的)强制转换现在更有意义了。
for (i = 0; i < 20; i++) {
scanf("%s", Class->first);
scanf("%s", Class->last);
scanf("%d", &Class->exam1);
scanf("%d", &Class->exam2);
scanf("%d", &Class->exam3);
Class->mean = (Class->exam1 + Class->exam2 + Class->exam3) / 3;
} //
for (i = 0; i < 20; i++){
printf("%s %s %f \n", Class->first, Class->last, Class->mean);
}
typedef struct student_info {
char *first;
char *last;
int exam1;
int exam2;
int exam3;
float mean;
} student;