【问题标题】:How to solve printing error using malloc method?如何使用 malloc 方法解决打印错误?
【发布时间】:2021-04-17 02:13:00
【问题描述】:

以下代码读取 .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

【问题讨论】:

    标签: c pointers malloc


    【解决方案1】:

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

    您需要为namenumber 成员分配空间以指向空间来存储有问题的字符串并将它们复制过来。您还为太多 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;
    }
    

    您还需要在scanf 循环中增加i

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

    【讨论】:

    • 感谢先生的建议。 strdup 完成了这项工作:)
    【解决方案2】:
      array_of_students[i] = make_node(name, num);
    

    但是当你绕过循环时,没有什么会增加 i。应该是i++

        print_array(array_of_students, 30);
    

    可能应该通过 i 而不是 30。

    for (int i = 0; i < 30; i++) 
    

    你没有在这里使用size

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-08
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      相关资源
      最近更新 更多