You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言日历调度器代码问题求助:5类功能异常需修复

C语言日历调度器问题修复与原因解析

问题1:任务标记未区分年份,跨年度同日期任务重复显示

问题原因

存储或查询任务时,仅匹配了月份和日期,未将年份纳入匹配条件。比如判断任务是否属于当前显示日历的逻辑中,只对比了task.month和task.day,忽略了task.year,导致不同年份的同日月任务会被同时显示。

修复方案

修改任务匹配逻辑,将年份、月份、日期三者作为联合判断条件。示例代码:

// 原错误逻辑(仅匹配月日)
if (task.month == current_calendar_month && task.day == current_calendar_day) {
    show_task(task);
}

// 修复后逻辑(同时匹配年、月、日)
if (task.year == current_calendar_year 
    && task.month == current_calendar_month 
    && task.day == current_calendar_day) {
    show_task(task);
}

问题2:displayCalendar中输入0无法返回主菜单,误进入任务笔记菜单

问题原因

displayCalendar函数的输入分支逻辑错误:要么未对输入0的情况做单独处理,要么分支判断顺序错误(比如先判断了输入1的分支,而0被误入其他条件)。例如,若代码先处理了choice >=1的分支,未提前处理choice==0,会导致输入0触发默认逻辑或错误分支。

修复方案

在输入处理逻辑最前端添加0的判断分支,直接返回主菜单。示例代码:

int choice;
scanf("%d", &choice);

// 优先处理返回主菜单的逻辑
if (choice == 0) {
    return; // 退出当前函数回到主菜单,或调用主菜单函数main_menu()
}

// 再处理其他分支
if (choice == 1) {
    enter_task_note_menu();
} else if (choice >= 2 && choice <= 31) {
    show_daily_tasks(choice);
} else {
    printf("输入无效,请重新选择\n");
}

问题3:编辑任务时显示无效索引范围(如1-6400548)

问题原因

用于统计有效任务数量的变量未正确初始化或更新:

  • 变量未初始化,导致读取到内存垃圾值;
  • 添加/删除任务后,未同步更新任务计数变量;
  • 遍历任务时未过滤已标记删除的无效任务,导致计数包含无效项。

修复方案

  1. 确保任务计数变量(如task_count)初始化为0;
  2. 添加任务时task_count++,删除有效任务时task_count--;
  3. 显示索引范围时,使用实际有效任务数:
// 修复后的索引提示
printf("请输入要编辑的任务索引(1-%d): ", task_count);

问题4:删除任务后仍可在编辑列表中找到该任务

问题原因

删除操作未真正移除任务数据,仅做了表面标记(如设置is_deleted标志),但编辑列表遍历逻辑未过滤已标记删除的任务;或删除后未更新任务计数,导致无效任务仍被纳入遍历范围。

修复方案

根据存储方式选择对应修复方式:

  • 数组存储:删除时将后续任务向前移动覆盖被删除项,同时减少任务计数:
// 假设tasks是任务数组,index为用户输入的任务索引(从1开始)
for (int i = index - 1; i < task_count - 1; i++) {
    tasks[i] = tasks[i + 1];
}
task_count--;
  • 标记删除:遍历编辑列表时,跳过已标记删除的任务:
for (int i = 0; i < task_count; i++) {
    if (!tasks[i].is_deleted) { // 仅显示未删除的任务
        printf("%d. %s\n", i+1, tasks[i].content);
    }
}

问题5:切换账号后任务数据未隔离,与原账号数据一致

问题原因

任务数据使用了全局变量或共享存储结构,未与账号ID关联:所有账号共用同一任务数组/文件,没有按账号维度筛选或隔离数据。

修复方案

  1. 给任务结构体添加account_id字段,绑定任务所属账号:
typedef struct {
    int account_id; // 新增:任务所属账号ID
    int year;
    int month;
    int day;
    char content[100];
    // 其他字段
} Task;
  1. 所有任务操作(添加、查询、编辑、删除)都需带上当前登录账号的account_id作为筛选条件:
// 查询当前账号的任务示例
for (int i = 0; i < task_count; i++) {
    if (tasks[i].account_id == current_login_user_id) {
        show_task(tasks[i]);
    }
}
  1. 存储数据时,可按账号分文件存储(如user_123_tasks.dat),或在同一文件中按账号ID分组存储。

内容的提问来源于stack exchange,提问作者presudeous

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 14:44:50