我为一个程序编写了一个代码,要求用户填写一个人的信息(ReadDate
/ ReadPerson
),然后询问用户想要打印的人的范围,以及该功能打印这些人。 (PrintRange
)
我不明白为什么程序不起作用;当它应该打印这个人时,它已经停留在这一点......这意味着PrintPerson
或PrintDate
或者我打电话的方式可能存在问题这些功能。
这是我的代码:
#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);
}
答案 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
。