weixin_51339970 2021-12-08 18:48 采纳率: 100%
浏览 57
已结题

c语言 创建菜单的时候遇到了incompatible pointer types assigning to 'struct category *' from 'pcategory'的error

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N sizeof(struct Category)

struct Category //define the category structure
{
    int categoryNo; //Category no
    char name[50];  //Name
    struct category *next;
};
typedef struct Category category;
typedef category *pcategory;

void save_Category(pcategory p);

int main()
{
    pcategory p; 
    char name[20];
    int categoryNo;
    char t;
    do
    {
        p = (pcategory)malloc(N);
        printf("请输入category:");
        scanf("%s", name);
        printf("请输入num:");
        scanf("%d", &categoryNo);
        p->categoryNo = categoryNo;
        strcpy(p->name, name);
            save_Category(p);

        printf("添加成功!是否继续?(1.是 2.否)");
        while (1)
        {
            t = getchar();
            if (t == '1')
                break;
            else if (t == '2')
                break;
        }
        if (t == '2')
            break;
    } while (1);
}
void save_Category(pcategory p) //保存主食信息
{
    FILE *fp;                         //文件指针
    fp = fopen("category.csv", "a+"); //以追加的方式打开文件
    if (fp == NULL)
    {
        printf("cannot open file\n");
    }
    if (fwrite(p, N, 1, fp) != 1) //将p1所指向的1个大小为N的数据结构写入fp所指向的文件中
    {
        printf("file write error\n");
    }
    fclose(fp); //关闭文件
}
pcategory readCategoryFile() //从主食文件中读取用户信息,返回一个表头地址
{
    FILE *fp;              //文件指针
    int n = 0;             //记录链表 的结点数
    pcategory head = NULL; //定义头指针
    pcategory p2, p, pre;
    fp = fopen("StapleFood.txt", "a+"); //以只读的方式打开文件
    if (fp == NULL)
    {
        printf("cannot open file\n");
    }Ï
    else
    {
        while (!feof(fp)) //判断文件位置标志是否移动到文件末尾
        {
            n++;
            p = (pcategory)malloc(N); //向内存申请一段空间
            fread(p, N, 1, fp);       //将fp所指向的文件中的内容赋给p
            if (n == 1)
            {
                head = p;
                p2 = p;
            }
            else //创建链表
            {
                pre = p2;
                p2->next = p;
                p2 = p;
            }
        }
        p2->next = NULL;
    }
    if (n <= 2)
        head->next = NULL;
    else
        pre->next = NULL;
    fclose(fp);  //关闭文件
    return head; //返回头指针
  • 写回答

2条回答 默认 最新

  • 关注

    结构体的定义错误,修改如下

    struct Category //define the category structure
    {
        int categoryNo; //Category no
        char name[50];  //Name
        struct Category *next;  //修改1 category
    };
    
    

    (2)#define N sizeof(struct Category)宏定义预先编译,编译的时候还不知道结构体Category是什么东西,所以N的值得到的不一定是结构体的实际大小,不建议你这么用,直接 用变量吧,别用宏定义了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月8日
  • 已采纳回答 12月8日
  • 创建了问题 12月8日

悬赏问题

  • ¥15 MATLAB代码补全插值
  • ¥15 Typegoose 中如何使用 arrayFilters 筛选并更新深度嵌套的子文档数组信息
  • ¥15 前后端分离的学习疑问?
  • ¥15 stata实证代码答疑
  • ¥50 husky+jaco2实现在gazebo与rviz中联合仿真
  • ¥15 dpabi预处理报错:Error using y_ExtractROISignal (line 251)
  • ¥15 在虚拟机中配置flume,无法将slave1节点的文件采集到master节点中
  • ¥15 husky+kinova jaco2 仿真
  • ¥15 zigbee终端设备入网失败
  • ¥15 金融监管系统怎么对7+4机构进行监管的