Quantiverse Josetar 2022-04-11 17:38 采纳率: 100%
浏览 41
已结题

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

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

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

  • 写回答

3条回答 默认 最新

  • 关注

    (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);
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月19日
  • 已采纳回答 4月11日
  • 创建了问题 4月11日

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度