使用C

时间:2015-11-04 03:24:56

标签: c arrays pointers struct

因此,这里的主要目标是从用户获取输入并将其存储在数组中,其中数组中的每个元素都是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);

}

2 个答案:

答案 0 :(得分:4)

这里的问题是你做的fill_in_srecord功能

struct srecord new_student;
r = &new_student;

这对三个原因有问题:

  1. 首先,new_student本地变量,一旦函数返回,它将超出范围并消失。任何指向它的指针都是杂散指针,使用它们会导致未定义的行为

  2. 第二个问题实际上使第一个问题没有实际意义,因为当您将值传递给C中的函数时,值被复制并且该函数只获得一个副本。修改副本(例如r = &new_student)当然不会修改原件。

  3. 第三个问题是,在调用函数时,会将指针传递给srecord结构的有效且现有的实例。根本不需要new_student变量或函数内r的重新分配。直接修改r就足够了。

  4. 所以解决方案就是没有两条有问题的线。

    还有另一件事,你在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);
 }