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)
问题原因
用于统计有效任务数量的变量未正确初始化或更新:
- 变量未初始化,导致读取到内存垃圾值;
- 添加/删除任务后,未同步更新任务计数变量;
- 遍历任务时未过滤已标记删除的无效任务,导致计数包含无效项。
修复方案
- 确保任务计数变量(如
task_count)初始化为0; - 添加任务时
task_count++,删除有效任务时task_count--; - 显示索引范围时,使用实际有效任务数:
// 修复后的索引提示 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关联:所有账号共用同一任务数组/文件,没有按账号维度筛选或隔离数据。
修复方案
- 给任务结构体添加
account_id字段,绑定任务所属账号:
typedef struct { int account_id; // 新增:任务所属账号ID int year; int month; int day; char content[100]; // 其他字段 } Task;
- 所有任务操作(添加、查询、编辑、删除)都需带上当前登录账号的
account_id作为筛选条件:
// 查询当前账号的任务示例 for (int i = 0; i < task_count; i++) { if (tasks[i].account_id == current_login_user_id) { show_task(tasks[i]); } }
- 存储数据时,可按账号分文件存储(如
user_123_tasks.dat),或在同一文件中按账号ID分组存储。
内容的提问来源于stack exchange,提问作者presudeous
相关产品推荐
相关产品推荐

