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

C语言员工管理系统ok字段存储异常与删改功能排查

C语言员工管理系统问题排查与修复

你的代码没有玄学bug,全是基础语法、内存操作和逻辑层面的错误,逐个修改即可解决问题:

1. ok字段写入异常的核心原因:内存操作完全错误

  • add函数里的内存分配语句t=(emp*)malloc(n*sizeof(int));是致命错误:sizeof(int)仅为4字节,但你的struct emp包含两个50字节的字符数组加3个int变量,总大小超过110字节。按int大小给n个员工分配内存,相当于每个员工只分到4字节空间,后续写入name、ok、年龄等字段时全是越界操作,堆内存数据被随意篡改,ok字段写入异常本质就是内存越界踩坏了数据。这行要改成t=(emp*)malloc(n*sizeof(struct emp));
  • 你在main函数里把k、t两个指针都指向了栈上的单个emp变量e,调用add(k,n)时只要n>1,写入第二个及以后员工数据就会越界破坏栈内存,连你存的员工数量n、菜单选项c这类变量都会被莫名修改。add函数本身已经返回了堆上分配的员工数组指针,直接用变量接住返回值使用即可,不要一开始把指针绑死在栈上的单个变量上。
  • 额外的编译错误:你代码里直接用emp作为类型名,但只定义了struct emp,没有用typedef给结构体起别名,所有写emp*、emp a的地方编译都会报错。要么在结构体定义处加typedef别名,要么所有用到该类型的地方写全struct emp。

2. 文件读写的细节错误

  • 用scanf读字符串时不要给字符数组名加&:比如scanf("%s",&(t+i)->ok);,ok本身就是字符数组首地址,加&虽然地址值相同,但类型不匹配,部分编译环境下会出现读写异常,直接写scanf("%s",(t+i)->ok);即可,读取name字段同理。
  • aff函数里循环变量定义写的是大写int I;,循环里用的是小写i,属于未定义变量,编译阶段就会报错,改成统一的小写变量名即可。
  • 所有fopen调用之后必须立刻做判空校验,如果文件打开失败(被占用、权限不足)直接读写会触发程序崩溃,要加判断逻辑:
f = fopen("Data.txt", "r");
if (f == NULL) {
    printf("打开文件失败\n");
    return;
}

3. 删除、修改功能无法运行的原因

你注释掉的两个功能函数全是基础语法和逻辑错误:

  • C语言不支持直接用=给字符数组赋值,你写的(t+i)->name=nv;完全无效,字符数组拷贝必须用strcpy或者strncpy函数。
  • del函数里你定义了emp a结构体变量来接收输入的整数ID,类型完全不匹配;循环变量k没有初始化就使用,内外层循环都用i当循环变量,直接导致循环逻辑混乱。
  • 两个功能都缺失持久化逻辑:你修改、删除完内存里的数组数据之后,必须重新把全量数据写回Data.txt,不然下次读文件还是旧数据。
    • 删除功能正确流程:输入要删除的员工ID -> 遍历数组找到对应下标 -> 从该下标开始把后面的元素逐个往前挪一位 -> 员工总数n减1 -> 把更新后的数组全量写回文件
    • 修改功能正确流程:输入要修改的员工ID -> 遍历找到对应元素 -> 提示用户输入新的各字段值覆盖原有内容 -> 把更新后的数组全量写回文件

4. 其他影响运行的逻辑bug

  • add函数里的char p;从来没有被赋值,后面判断if(p=='y')的行为完全随机,因为未初始化的栈变量值是内存里的垃圾值,这个判断逻辑根本不会按预期运行。
  • 你每次调用add都用"w"模式打开文件,会直接清空文件里之前存的所有员工数据,新加入的员工会把旧数据完全覆盖。如果要保留旧数据,应该先把文件里原有员工读入内存,重新分配更大的内存空间存储新员工,最后再全量写回文件。
  • 全局定义的FILE *f没必要做成全局变量,在每个操作文件的函数里定义局部FILE指针即可,全局变量很容易引发状态混乱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:31:06