为什么我的程序不会用 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;
}

我修复了你的代码,我发现的问题是

  1. 第一次分配,对于struct family *member是错误的,因为它应该在循环

    之前执行
    member=(struct family*)malloc(j*sizeof(struct family));
    for (k = 0 ; k < j ; k++) ...
    
  2. 你从来不用分配的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)); 
    
  3. 你的名字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时加上错误校验码就好了。假设用户总是提供良好的输入不是一个好的做法。