为什么我的程序不会用 printf(); 显示每个元素?
Why my program won't show each element with printf();?
我制作了一个非常小的程序,它实际上允许您创建具有 X 个成员的 N 个家庭,当我尝试显示所有家庭的 "ALL" 名成员时,我无法显示,它只会显示最后一个家庭成员。为什么以及如何修复它?
................................................ ..................................................... ..................................................... .....................
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
struct family {
int size;
struct person *member;
char address[256];
};
struct person {
int age;
char name[30];
};
int main(){
struct family *member;
struct person *ptr;
int j,k;
int i,n;
printf("\nEnter family count: ");
scanf("%d",&j);
for(k=0;k<j;k++){
member=(struct family*)malloc(j*sizeof(struct family));
printf("Enter family member count: ");
scanf("%d",&n);
ptr=(struct person*)malloc(n*sizeof(struct person));
for(i=0;i<n;++i){
printf("\nEnter person and the age:\n");
scanf("%s%d",&(ptr+i)->name, &(ptr+i)->age);
}
}
printf("\nDisplaying Infromation:\n");
for(i=0;i<n;++i)
printf("%s\t%d\t\n",(ptr+i)->name,(ptr+i)->age);
_getch();
return 0;
}
我修复了你的代码,我发现的问题是
第一次分配,对于struct family *member
是错误的,因为它应该在循环
之前执行
member=(struct family*)malloc(j*sizeof(struct family));
for (k = 0 ; k < j ; k++) ...
你从来不用分配的struct family *member;
它应该用来存放家庭成员,所以我把它改名为family
,所以你有一个成员size
在该结构中,成员计数的 scanf
应该存储值
printf("Enter family member count: ");
scanf("%d", &member[k].size);
现在值存储在 size
成员中,因此下一个循环应该像
for (j = 0 ; j < member[k].size ; j++)
和循环之前的malloc
,应该是
member[k].member = malloc(member[k].size * sizeof(struct person));
你的名字scanf
是错误的,你不应该取数组的地址
scanf("%s%d",&(ptr+i)->name, &(ptr+i)->age); -> scanf("%s%d",(ptr+i)->name, &(ptr+i)->age);
但根据前面提到的问题,你应该这样做
scanf("%s%d", member[k].memberj].name, &member[k].member[j].age);
在所有这些都修复之后,您可以输出遍历所有 member
元素和所有 member->member
元素的数据。
这里是固定码
struct family
{
int size;
struct person *member;
char address[256];
};
struct person
{
int age;
char name[30];
};
int main()
{
struct family *family;
int familyCount, i, j;
printf("\nEnter family count: ");
scanf("%d", &familyCount);
family = malloc(familyCount * sizeof(*family));
for (i = 0 ; i < familyCount ; i++)
{
printf("Enter family member count: ");
scanf("%d", &family[i].size);
family[i].member = malloc(family[i].size * sizeof(*(family[i].member)));
for (j = 0 ; j < family[i].size ; ++j)
{
printf("\nEnter person and the age:\n");
scanf("%s%d", family[i].member[j].name, &family[i].member[j].age);
}
}
for (i = 0 ; i < familyCount ; ++i)
{
printf("Family %d:\n", 1 + i);
for (j = 0 ; j < family[i].size ; ++j)
printf("\tmember %d: %s, %d\n", 1 + j, family[i].member[j].name, family[i].member[j].age);
}
return 0;
}
这些行:
for(k=0;k<j;k++){
member=(struct family*)malloc(j*sizeof(struct family));
确保在循环结束时只保留最后一个member
。
这一行
ptr=(struct person*)malloc(n*sizeof(struct person));
确保在循环结束时只保留最后一个ptr
。
你需要的是:
int main(){
struct family *family_array = NULL;
int j,k;
int i,n;
printf("\nEnter family count: ");
scanf("%d",&j);
// Allocate memory for j families.
family_array = malloc(j*sizeof(struct family));
// Read the data for each family.
for(k=0;k<j;k++){
printf("Enter family member count: ");
scanf("%d",&n);
// Make sure to store the size of the family.
family_array[k].size = n;
// Allocate memory for the members of the family.
family_array[k].member = malloc(n*sizeof(struct person));
// Read the data for each member of the family.
for(i=0;i<n;++i){
printf("\nEnter person and the age:\n");
scanf("%s%d",family_array[k].member[i].name, &(family_array[k].member[i].age));
}
}
printf("\nDisplaying Infromation:\n");
for(k=0;k<j;k++)
{
n = family_array[k].size;
for(i=0;i<n;++i)
{
printf("%s\t%d\t\n", family_array[k].member[i].name, family_array[k].member[i].age);
}
}
// Make sure to deallocate the memory.
for(k=0;k<j;k++)
{
free(family_array[k].member);
}
free(family_array);
_getch();
return 0;
}
PS 每次使用scanf
时加上错误校验码就好了。假设用户总是提供良好的输入不是一个好的做法。
我制作了一个非常小的程序,它实际上允许您创建具有 X 个成员的 N 个家庭,当我尝试显示所有家庭的 "ALL" 名成员时,我无法显示,它只会显示最后一个家庭成员。为什么以及如何修复它?
................................................ ..................................................... ..................................................... .....................
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
struct family {
int size;
struct person *member;
char address[256];
};
struct person {
int age;
char name[30];
};
int main(){
struct family *member;
struct person *ptr;
int j,k;
int i,n;
printf("\nEnter family count: ");
scanf("%d",&j);
for(k=0;k<j;k++){
member=(struct family*)malloc(j*sizeof(struct family));
printf("Enter family member count: ");
scanf("%d",&n);
ptr=(struct person*)malloc(n*sizeof(struct person));
for(i=0;i<n;++i){
printf("\nEnter person and the age:\n");
scanf("%s%d",&(ptr+i)->name, &(ptr+i)->age);
}
}
printf("\nDisplaying Infromation:\n");
for(i=0;i<n;++i)
printf("%s\t%d\t\n",(ptr+i)->name,(ptr+i)->age);
_getch();
return 0;
}
我修复了你的代码,我发现的问题是
第一次分配,对于
之前执行struct family *member
是错误的,因为它应该在循环member=(struct family*)malloc(j*sizeof(struct family)); for (k = 0 ; k < j ; k++) ...
你从来不用分配的
struct family *member;
它应该用来存放家庭成员,所以我把它改名为family
,所以你有一个成员size
在该结构中,成员计数的scanf
应该存储值printf("Enter family member count: "); scanf("%d", &member[k].size);
现在值存储在
size
成员中,因此下一个循环应该像for (j = 0 ; j < member[k].size ; j++)
和循环之前的
malloc
,应该是member[k].member = malloc(member[k].size * sizeof(struct person));
你的名字
scanf
是错误的,你不应该取数组的地址scanf("%s%d",&(ptr+i)->name, &(ptr+i)->age); -> scanf("%s%d",(ptr+i)->name, &(ptr+i)->age);
但根据前面提到的问题,你应该这样做
scanf("%s%d", member[k].memberj].name, &member[k].member[j].age);
在所有这些都修复之后,您可以输出遍历所有
member
元素和所有member->member
元素的数据。
这里是固定码
struct family
{
int size;
struct person *member;
char address[256];
};
struct person
{
int age;
char name[30];
};
int main()
{
struct family *family;
int familyCount, i, j;
printf("\nEnter family count: ");
scanf("%d", &familyCount);
family = malloc(familyCount * sizeof(*family));
for (i = 0 ; i < familyCount ; i++)
{
printf("Enter family member count: ");
scanf("%d", &family[i].size);
family[i].member = malloc(family[i].size * sizeof(*(family[i].member)));
for (j = 0 ; j < family[i].size ; ++j)
{
printf("\nEnter person and the age:\n");
scanf("%s%d", family[i].member[j].name, &family[i].member[j].age);
}
}
for (i = 0 ; i < familyCount ; ++i)
{
printf("Family %d:\n", 1 + i);
for (j = 0 ; j < family[i].size ; ++j)
printf("\tmember %d: %s, %d\n", 1 + j, family[i].member[j].name, family[i].member[j].age);
}
return 0;
}
这些行:
for(k=0;k<j;k++){
member=(struct family*)malloc(j*sizeof(struct family));
确保在循环结束时只保留最后一个member
。
这一行
ptr=(struct person*)malloc(n*sizeof(struct person));
确保在循环结束时只保留最后一个ptr
。
你需要的是:
int main(){
struct family *family_array = NULL;
int j,k;
int i,n;
printf("\nEnter family count: ");
scanf("%d",&j);
// Allocate memory for j families.
family_array = malloc(j*sizeof(struct family));
// Read the data for each family.
for(k=0;k<j;k++){
printf("Enter family member count: ");
scanf("%d",&n);
// Make sure to store the size of the family.
family_array[k].size = n;
// Allocate memory for the members of the family.
family_array[k].member = malloc(n*sizeof(struct person));
// Read the data for each member of the family.
for(i=0;i<n;++i){
printf("\nEnter person and the age:\n");
scanf("%s%d",family_array[k].member[i].name, &(family_array[k].member[i].age));
}
}
printf("\nDisplaying Infromation:\n");
for(k=0;k<j;k++)
{
n = family_array[k].size;
for(i=0;i<n;++i)
{
printf("%s\t%d\t\n", family_array[k].member[i].name, family_array[k].member[i].age);
}
}
// Make sure to deallocate the memory.
for(k=0;k<j;k++)
{
free(family_array[k].member);
}
free(family_array);
_getch();
return 0;
}
PS 每次使用scanf
时加上错误校验码就好了。假设用户总是提供良好的输入不是一个好的做法。