(C)从调用其他函数的函数中打印结构数组

时间:2017-01-28 17:20:48

标签: c pointers struct

我为一个程序编写了一个代码,要求用户填写一个人的信息(ReadDate / ReadPerson),然后询问用户想要打印的人的范围,以及该功能打印这些人。 (PrintRange

我不明白为什么程序不起作用;当它应该打印这个人时,它已经停留在这一点......这意味着PrintPersonPrintDate或者我打电话的方式可能存在问题这些功能。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct{
    int day, month, year;
}  Date;

typedef struct{
    char *first_name, *last_name;
    int id;
    Date birthday;
}  Person;

void ReadDate(Date *a)
{
    printf("Enter the day: ");
    scanf("%d", &a->day);
    printf("Enter the month (1-12): ");
    scanf("%d", &a->month);
    printf("Enter the year: ");
    scanf("%d", &a->year);
}

void ReadPerson(Person *b)
{
    char temp_first_name[21];
    char temp_last_name[21];

    printf("Enter the first name: ");
    gets(temp_first_name);
    b->first_name = (char*)malloc(strlen(temp_first_name)+1);
    strcpy(b->first_name,temp_first_name);
    //need to check malloc (later)

    printf("Enter the last name: ");
    gets(temp_last_name);
    b->last_name = (char*)malloc(strlen(temp_last_name)+1);
    strcpy(b->last_name, temp_last_name);
    //need to check malloc (later)

    printf("Enter the id number: ");
    scanf("%d",&b->id);

    printf("Enter the birthday:\n");
    ReadDate(&b->birthday);
}

int ReadAllDate (Person *b)
{
    //Person* b;
    int count=1;
    char choice;
    printf("Would you like to enter a person?(y,n)\n");
    choice = getchar();
    while(choice == 'y')
    {
        b = (Person*)malloc(1 * sizeof(Person));
        getchar();
        ReadPerson(b);
        printf("Done!\n");
        count++;
        getchar();
        printf("Would you like to add a person?(y,n)\n");
        choice = getchar();
    }
    count--;
    printf("The number of entered persons is %d\nBye\n", count);

    return count;
}

void PrintPerson(Person b)
{
    printf("%s  %s  %d\n", b.first_name, b.last_name, b.id);
}

void PrintDate(Date a)
{
    printf("%d // %d // %d\n",a.day,a.month,a.year);
}

void PrintRange(Person *b,int count,int ind1,int ind2)
{
    int i;

    if (ind1<0 || ind1>ind2 || ind2>count)
    {
        printf("error! you slip out from the limits of the array.\n");
    }
    else
    {
        for (i=ind1; i<=ind2; i++)
        {
            PrintPerson(*(b+i));
            PrintDate((b+i)->birthday);
        }
    }
}

int main(int argc, const char * argv[])
{
    Person* b;
    int count;
    int ind1, ind2;

    count = ReadAllDate(b);

    printf("insert the first index (the smaller): ");
    scanf("%d", &ind1);
    printf("insert the second index (the bigger): ");
    scanf("%d", &ind2);
    PrintRange(b, count, ind1, ind2);
}

1 个答案:

答案 0 :(得分:2)

问题在于,您实际上无处创建Person个对象的数组。函数ReadAllDate()永远不会更改b中变量main()的值。相反,对于您读入的每个人,它都会为其分配内存,并将Person的指针存储在b局部变量 ReadAllDate()中。每次执行此操作时,都会忘记之前的b值。

main()中,b的值始终是单元化的。当你试图打印人时,它很可能会崩溃或打印垃圾。

我发现您的代码存在其他问题:

  • 请勿使用gets(),请始终使用fgets()。前者可以写出你提供的缓冲区的末尾。
  • 请勿malloc(strlen(...)) + strcpy()使用strdup()
  • count = 0开始,这样您就不需要count--中的ReadAllDate()了。作为计算机程序员,最好从零而不是一个计算。
  • b[i]代替*(b+i)b[i].birthday代替(b+i)->birthday