c - 如何使用 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
解决方案
您正在为您正在创建的每个对象分配相同的指针值,name
并覆盖这些指针每次指向的数组。number
Student
您需要为name
andnumber
成员分配空间以指向空间来存储有问题的字符串并将它们复制过来。您还为太多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;
}
您还需要i
在scanf
循环中递增:
i = 0;
while (fscanf( in , "%s %s", name, num) == 2) {
array_of_students[i++] = make_node(name, num);
}
推荐阅读
- java - 重新打包 Spring Boot Jar 时如何修复压缩错误
- azure - 无法使用 New-AzStorageContainer 创建新容器
- c# - 子资源在完全发展的关系 EF Core 中再次显示
- r - FUN(X[[i]], ...) 中的错误:使用 ggplot 制作南极洲地图时找不到对象“组”
- xv6 - make qemu on xv6-riscv 卡在 qemu-system-riscv64 ... 命令
- javascript - 如何在不进行多个 if 语句的情况下搜索数组?
- asp.net - 使用不同表的 asp.net 核心 Web 应用程序中的 RoleManager
- r - 如何将自定义限制应用于 tmap 中的连续色带
- python - 单独提供 IV 和 Value 时 Python 中的 AES 解密
- python - 模拟请求.post