c语言运行结构体数组读写文件代码的时候程序要么崩溃要么退出

问题遇到的现象和发生背景
问题相关代码,请勿粘贴截图

结构体定义
struct fruitstorage
{
char* name;//水果名字
int quantity[10];//进货日期,数量
//int day, quantity;//进货日期,数量
int num, dayquantity;//链表编号,日期个数
float price;//价格
struct fruitstorage* pre, * next;
};
函数:
fruitstorage head[21]={};
/head = (fruitstorage)malloc(sizeof(fruitstorage) * 21);/
FILE
f;
f = fopen("水果库存.txt", "r+");
int t, s, m;

for (m = 1; m <= 21; m++)
{
    head[m].dayquantity = 0;
    head[m].num = m;
    fscanf(f, "%s", head[m].name);
    fscanf(f, "%f", head[m].price);
    fscanf(f, "%d", &t);

    while (t != -1)
    {
        s = t;
        fscanf(f, "%d", &t);
        head[m].quantity[s] = t;
        head[m].dayquantity++;
        fscanf(f, "%d", &t);
    }

    head[m].quantity[s + 1] = -1;
}
fclose(f);
运行结果及报错内容

img

我的解答思路和尝试过的方法
我想要达到的结果

能通过结构体数组读写文件

(1)fruitstorage head[21]这个数组一共21个元素,下标从0到20,但是你的for (m = 1; m <= 21; m++) 中,下标是从1到21,数组越界了,应该是:

for (m = 0; m < 21; m++)

(2)fscanf(f, "%f", head[m].price);这里,head[m].price前需要加&符号

fscanf(f, "%f", &head[m].price);

(3)head[m].quantity[s] = t; 和head[m].quantity[s + 1] = -1;这两句,最好先判断一下s和s+1是否在[010)之间,否则可能出现数组越界的情况

(4)结构体中的name是指针,使用前需要先分配空间,或者直接使用字符数组。
代码修改如下,修改部分有注释:

struct fruitstorage
{
    char name[20];//水果名字  ------------修改,这里直接用字符数组,不要用指针
    int quantity[10];//进货日期,数量
    //int day, quantity;//进货日期,数量
    int num, dayquantity;//链表编号,日期个数
    float price;//价格
    struct fruitstorage* pre, * next;
};
//函数:
fruitstorage head[21] = {};
// head = (fruitstorage)malloc(sizeof(fruitstorage) * 21); /
FILE* f;
f = fopen("水果库存.txt", "r+");
int t, s, m;

for (m = 0; m < 21; m++)  //-------------- 修改   这里从020
{
    head[m].dayquantity = 0;
    head[m].num = m;
    fscanf(f, "%s", head[m].name);
    fscanf(f, "%f", &head[m].price); //-----------修改,这里需要加&符号 
    fscanf(f, "%d", &t);

    while (t != -1)
    {
        s = t;
        fscanf(f, "%d", &t);
        //----------------- 修改,这里最好先判断一下s是否超出
        if(s>=0 && s<10)
            head[m].quantity[s] = t;
        head[m].dayquantity++;
        fscanf(f, "%d", &t);
    }
    // -------- 修改,这里最好先判断一下s是否超出
    if(s+1>=0 && s+1<10)
        head[m].quantity[s + 1] = -1;
}
fclose(f);

img

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632