马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 Justin1 于 2020-6-4 08:17 编辑
再用结构体指针写图书馆代码的时候,需要用到指针数组,且数组里的每一个元素都得指向结构体。
然后我写了一个代码i = 0;
char *p[n];
while( i < n )
{
struct Book p[i];
p[i] = (struct Book *)malloc(sizeof(struct Book));
我的思路是这样子的
我需要一个指针数组,那么我先申明一个n个指针的数组(n的话已知,已经输入进去了)
然后进入循环 循环条件 为 i < n(后面代码是有 i +=1的 我闲啰嗦没贴)
好的接下来 p[i]是p数组的元素,也就是个指针 ,我让它指向结构体Book
之后,我用malloc申请一个大小和结构体一样大空间返回值为结构体指针的地址 并将它赋值给p[i]这个指针
但是我运行了程序
大概意思都是说类型不匹配
后来我对代码进行了一些修改,
改成了 struct Book *book[n];就可以运行了
这我就有点不理解了
第一次写的代码(有错)如下#include <stdio.h>
#include <stdlib.h>
//struct Date struct Book void getInput(*p) void PBooks(*p)
struct Date
{
int year;
int month;
int day;
}date;
struct Book
{
char title[100];
char author[40];
float price;
struct Date date;
char publisher[100];
};
void getInput(struct Book *book);
void PBooks(struct Book *book);
void getInput(struct Book *book)
{
printf("请输入书名:");
scanf("%s",book->title);
printf("请输入作者:");
scanf("%s",book->author);
printf("请输入价格");
scanf("%f",&book->price);
printf("请输入出版日期");
scanf("%d-%d-%d",&book->date.year,&book->date.month,&book->date.day);
printf("请输入出版社");
scanf("%s",book->publisher);
}
void PBooks(struct Book *book)
{
printf("书的名字是:%s",book->title);
printf("书的作者是:%s",book->author);
printf("书的价格是:%.2f",book->price);
printf("书的出版日期是:%d-%d-%d",book->date.year,book->date.month,book->date.day);
printf("书的出版社是:%s",book->publisher);
}
int main(void)
{
int n;
int i = 0 ;
printf("*请输入你要存放的书本的个数:");
scanf("%d",&n);
i = 0;
char *p[n];
while( i < n )
{
struct Book p[i];
p[i] = (struct Book *)malloc(sizeof(struct Book));
printf("这本书开始输入");
if(p[i] == NULL)
{
printf("分配内存失败");
exit(1);
}
getInput(p[i]);
printf("*这本书输入完毕*");
putchar('\n');
printf("这本书开始打印:");
PBooks(p[i]);
printf("*这本书打印完毕*");
free(p[i]);
}
putchar('\n');
return 0;
}
这是修改后可以运行的代码
#include <stdio.h>
#include <stdlib.h>
//struct Date struct Book void getInput(*p) void PBooks(*p)
struct Date
{
int year;
int month;
int day;
};
struct Book
{
char title[100];
char author[40];
float price;
struct Date date;
char publisher[100];
};
void getInput(struct Book* book);
void PBooks(struct Book* book);
void getInput(struct Book* book)
{
printf("请输入书名:");
scanf("%s", book->title);
printf("请输入作者:");
scanf("%s", book->author);
printf("请输入价格");
scanf("%f", &book->price);
printf("请输入出版日期");
scanf("%d-%d-%d", &book->date.year, &book->date.month, &book->date.day);
printf("请输入出版社");
scanf("%s", book->publisher);
}
void PBooks(struct Book* book)
{
printf("书的名字是:%s\n", book->title);
printf("书的作者是:%s\n", book->author);
printf("书的价格是:%.2f\n", book->price);
printf("书的出版日期是:%d-%d-%d\n", book->date.year, book->date.month, book->date.day);
printf("书的出版社是:%s\n", book->publisher);
}
int main(void)
{
int n;
int i = 0;
printf("*请输入你要存放的书本的个数:");
scanf("%d", &n);
while (i < n)
{
struct Book* book[i];
book[i] = (struct Book*)malloc(sizeof(struct Book));
printf("这本书开始输入");
if (book[i] == NULL)
{
printf("内存分配失败");
exit(1);
}
getInput(book[i]);
printf("*这本书输入完毕*\n");
putchar('\n');
printf("这本书开始打印:\n");
PBooks(book[i]);
printf("*这本书打印完毕*\n");
free(book[i]);
i += 1;
}
putchar('\n');
return 0;
}
本帖最后由 sunrise085 于 2020-6-3 22:31 编辑
修改前的程序,有个地方写错了。
while循环前,char*p[n]改为struct Book* p[n]就可以了。
类型写错了。
然后把第62行去掉
|