鱼C论坛

 找回密码
 立即注册
查看: 577|回复: 4

[已解决]结构体指针问题

[复制链接]
发表于 2020-6-3 22:18:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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]这个指针

但是我运行了程序
6.3error.png
大概意思都是说类型不匹配

后来我对代码进行了一些修改,
改成了 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;
}
最佳答案
2020-6-3 22:30:00
本帖最后由 sunrise085 于 2020-6-3 22:31 编辑

修改前的程序,有个地方写错了。
while循环前,char*p[n]改为struct Book* p[n]就可以了。
类型写错了。
然后把第62行去掉
6.4rror.png
6.41.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-3 22:27:55 | 显示全部楼层
指针也是有类型的!
而且你的 struct Book p[i]; 我着实没看懂。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-3 22:30:00 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sunrise085 于 2020-6-3 22:31 编辑

修改前的程序,有个地方写错了。
while循环前,char*p[n]改为struct Book* p[n]就可以了。
类型写错了。
然后把第62行去掉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-4 07:35:57 | 显示全部楼层
sunrise085 发表于 2020-6-3 22:30
修改前的程序,有个地方写错了。
while循环前,char*p[n]改为struct Book* p[n]就可以了。
类型写错了。
...

谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-4 08:22:42 | 显示全部楼层
sunrise085 发表于 2020-6-3 22:30
修改前的程序,有个地方写错了。
while循环前,char*p[n]改为struct Book* p[n]就可以了。
类型写错了。
...

还是有个小毛病。改了之后在devc++里运行成功了,但是viusal studio2019里报错,错误大概就是说不能输入变量表达式。一般是用devc++的,所以vs还不大习惯 6.4rror.png 6.41.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 17:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表