Justin1 发表于 2020-6-3 22:18:39

结构体指针问题

本帖最后由 Justin1 于 2020-6-4 08:17 编辑

再用结构体指针写图书馆代码的时候,需要用到指针数组,且数组里的每一个元素都得指向结构体。
然后我写了一个代码i = 0;
        char *p;
        while( i < n )
        {
                struct Book p;
                p = (struct Book *)malloc(sizeof(struct Book));
我的思路是这样子的
我需要一个指针数组,那么我先申明一个n个指针的数组(n的话已知,已经输入进去了)
然后进入循环 循环条件 为 i < n(后面代码是有 i +=1的 我闲啰嗦没贴)
好的接下来 p是p数组的元素,也就是个指针 ,我让它指向结构体Book
之后,我用malloc申请一个大小和结构体一样大空间返回值为结构体指针的地址   并将它赋值给p这个指针

但是我运行了程序

大概意思都是说类型不匹配

后来我对代码进行了一些修改,
改成了 struct Book *book;就可以运行了

这我就有点不理解了

第一次写的代码(有错)如下
#include <stdio.h>
#include <stdlib.h>


//struct Datestruct Book   void getInput(*p)void PBooks(*p)
struct Date
{
        int year;
        int month;
        int day;
}date;

struct Book
{
        char title;
        char author;
        float price;
        struct Date date;
        char publisher;
};

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;
        while( i < n )
        {
                struct Book p;
                p = (struct Book *)malloc(sizeof(struct Book));
                printf("这本书开始输入");
                if(p == NULL)
                {
                        printf("分配内存失败");
                        exit(1);
                }
                getInput(p);
                printf("*这本书输入完毕*");
          putchar('\n');
          printf("这本书开始打印:");
                PBooks(p);
                printf("*这本书打印完毕*");
                free(p);
        }
        putchar('\n');
       
        return 0;
}


这是修改后可以运行的代码

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


//struct Datestruct Book   void getInput(*p)void PBooks(*p)
struct Date
{
        int year;
        int month;
        int day;
};

struct Book
{
        char title;
        char author;
        float price;
        struct Date date;
        char publisher;
};

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;
                book = (struct Book*)malloc(sizeof(struct Book));
                printf("这本书开始输入");
                if (book == NULL)
                {
                        printf("内存分配失败");
                        exit(1);
                }
                getInput(book);
                printf("*这本书输入完毕*\n");
                putchar('\n');
                printf("这本书开始打印:\n");
                PBooks(book);
                printf("*这本书打印完毕*\n");
                free(book);
                i += 1;
        }
        putchar('\n');

        return 0;
}

永恒的蓝色梦想 发表于 2020-6-3 22:27:55

指针也是有类型的!
而且你的 struct Book p; 我着实没看懂。

sunrise085 发表于 2020-6-3 22:30:00

本帖最后由 sunrise085 于 2020-6-3 22:31 编辑

修改前的程序,有个地方写错了。
while循环前,char*p改为struct Book* p就可以了。
类型写错了。
然后把第62行去掉

Justin1 发表于 2020-6-4 07:35:57

sunrise085 发表于 2020-6-3 22:30
修改前的程序,有个地方写错了。
while循环前,char*p改为struct Book* p就可以了。
类型写错了。
...

谢谢!{:10_298:}

Justin1 发表于 2020-6-4 08:22:42

sunrise085 发表于 2020-6-3 22:30
修改前的程序,有个地方写错了。
while循环前,char*p改为struct Book* p就可以了。
类型写错了。
...

还是有个小毛病。改了之后在devc++里运行成功了,但是viusal studio2019里报错,错误大概就是说不能输入变量表达式。一般是用devc++的,所以vs还不大习惯。
页: [1]
查看完整版本: 结构体指针问题