首页 > 解决方案 > 如何使用 malloc 方法解决打印错误?

问题描述

下面的代码读取 .txt 文件的内容并将其存储到数组中。但是,它不会打印文件中的所有名称,而是仅打印最后一行Matthew 789 30 次。我的打印功能看起来正确,但不确定我哪里出错了。

主要的

while (fscanf( in , "%s %s", name, num) == 2) {
  array_of_students[i] = make_node(name, num);
}

printf("\nOriginal unsorted array\n");
print_array(array_of_students, 30);

功能:

Student * make_node(char * name, char * number) {
  Student * new_student;
  new_student = (Student * ) malloc(CLASS_SIZE * sizeof(Student));
  int i = 0;
  new_student[i].name = NULL;
  new_student[i].number = NULL;
  new_student[i].name = name;
  new_student[i].number = number;
  i++;
  return new_student;
}

void print_array(Student * array_of_students[], int size) {
  for (int i = 0; i < 30; i++) {
    printf("%s %s\n", array_of_students[i] -> name, array_of_students[i] -> number);
  }
}

txt文件:

John 123
Walter 456
Matthew 789

标签: cpointersmalloc

解决方案


您正在为您正在创建的每个对象分配相同的指针值,name并覆盖这些指针每次指向的数组。numberStudent

您需要为nameandnumber成员分配空间以指向空间来存储有问题的字符串并将它们复制过来。您还为太多Student对象分配空间。你只需要一个:

Student *make_node(char * name, char * number) {
  Student *new_student = malloc(sizeof(Student));
  new_student->name = strdup(name);
  new_student->number = strdup(number);
  return new_student;
}

您还需要iscanf循环中递增:

i = 0;
while (fscanf( in , "%s %s", name, num) == 2) {
  array_of_students[i++] = make_node(name, num);
}

推荐阅读