因此,这里的主要目标是从用户获取输入并将其存储在数组中,其中数组中的每个元素都是struct srecord。我希望能够检索字符串fname和lname以及分数。这是至关重要的,因为我还将设计其他方法来计算阵列中所有学生的平均值,并告诉哪些学生得分最高或最低。
例如在fill_in_srecord_array中,如果我想在运行fill_in_srecord后打印出[i]中的信息,那么这是正确的行吗?
printf("%s %s: Score= %d\n", a[i].fname, a[i].lname, a[i].score);
但这不能编译,所以这里有什么问题?
我的fill_in_srecord方法是否正常工作并且实际上正确地填充了数组?
为了将来参考,从存储在数组中的结构访问变量的最佳方法是什么?
#include <stdio.h>
#include <string.h>
struct srecord {
char fname[20]; /* first name */
char lname[20]; /* last name */
int score;
};
void fill_in_srecord(struct srecord *r){
struct srecord new_student; //declare a new student record
r = &new_student; //assign a value to the pointer
printf("Enter student first name: "); //request input
scanf("%s", r->fname);
printf("First: %s",r->fname);
printf("\nEnter student last name: ");
scanf("%s", r->lname);
printf("Last: %s",r->lname);
printf("\nEnter student score: ");
scanf("%d", &(r->score));
printf("Score: %d\n", r->score);
}
void fill_in_srecord_array(struct srecord a[], int len){
a[len];
//struct srecord *p; //srecord pointer
for(int i = 0; i<len; i++) {
fill_in_srecord(&a[i]);
}
}
int main(){
struct srecord students[2];
fill_in_srecord_array(students, 2);
exit (0);
}
答案 0 :(得分:4)
这里的问题是你做的fill_in_srecord
功能
struct srecord new_student;
r = &new_student;
这对三个原因有问题:
首先,new_student
是本地变量,一旦函数返回,它将超出范围并消失。任何指向它的指针都是杂散指针,使用它们会导致未定义的行为。
第二个问题实际上使第一个问题没有实际意义,因为当您将值传递给C中的函数时,值被复制并且该函数只获得一个副本。修改副本(例如r = &new_student
)当然不会修改原件。
第三个问题是,在调用函数时,会将指针传递给srecord
结构的有效且现有的实例。根本不需要new_student
变量或函数内r
的重新分配。直接修改r
就足够了。
所以解决方案就是没有两条有问题的线。
还有另一件事,你在a[len];
函数中的语句fill_in_srecord_array
并没有真正做任何事情。但如果它做了任何事情,它将导致未定义的行为,因为你将数组a
索引越界。
答案 1 :(得分:1)
现在你正在对局部变量进行更改,而这些局部变量无法从功能块中访问,并且对调用函数本身的变量不会对其进行更改。
当您将a[i]
的地址传递给函数时,如果您对函数中的函数进行了更改,则a[i]
将在调用函数本身中进行修改。因为更改将直接发送到其地址的内容,这本身也是如此。
你需要做的就是写这样的函数 -
void fill_in_srecord(struct srecord *r){
/* struct srecord new_student; //declare a new student record */
/* r = &new_student; //assign a value to the pointer */
printf("Enter student first name: "); //request input
scanf("%s", r->fname);
printf("First: %s",r->fname);
printf("\nEnter student last name: ");
scanf("%s", r->lname);
printf("Last: %s",r->lname);
printf("\nEnter student score: ");
scanf("%d", &(r->score));
printf("Score: %d\n", r->score);
}