AI 给的代码不能全信一次真实的取舍这份作业最有意思的地方是它明确把和大模型协作当成考核内容其中一项要求是学生要设计有约束的提示词理解 AI 给的候选代码发现并修正至少一项问题。也就是说用 AI 是允许的但不能照单全收。这篇记录我遇到的一次真实抉择。事情的起因写完读取函数之后我把代码拿给另一个大模型做审查问它这段解析有没有问题。它给了挺长一段回复指出sscanf有几个已知的漏洞然后给了一套完整的改法用strchr手动切分每一列用strtod代替sscanf做数值转换再检查 NaN 和无穷大另外还要处理行尾多余的列、字段前后的空格等等。它说得对不对大部分是对的。比如sscanf确实会放过行尾多出来的内容if (x 0 || x 8)这种写法确实拦不住 NaN因为 NaN 和任何数比较都是假。这些都是真的知识。它甚至还主动说明可以帮我直接把这几处改出来。我为什么没有全盘采纳问题不在技术在我自己。那套改法里有大量指针操作手动切字符串、移动指针、处理结尾符而我当时刚学到结构体指针只懂基础用法。就算我把代码复制过去能跑通我也讲不清楚每一行在干什么。而任务书里写得很明确不得仅提交模型生成的完整程序却无法解释其原理考核方式是个人答辩重点核验学生是否真正理解核心代码。照抄一套讲不明白的代码等于自己把答辩这条路堵死。所以我的判断是能讲明白的八十分胜过讲不明白的一百分。逐条评估之后的做法我没有全盘接受也没有全盘否定而是把它的建议拆开一条条看。采纳的第一条是表头校验。原来的代码无条件跳过第一行如果拿到的文件根本没有表头后面的解析就全错了。加一个检查看第一行里有没有约定的字段名没有就拒收。这个用strstr一行搞定我能讲清楚。采纳的第二条是缓冲区放大。原来行缓冲是 256 字节如果某一行特别长fgets会把它截成两半后半截被当成新的一行解析可能存进错误的数据。改成 1024一个数字的事。采纳的第三条是截断提示。原来样本数超过上限时直接break就停了用户不知道数据被截断。在跳出循环前加一句提示让人知道发生了什么。没采纳的是用%c抓行尾多余内容那条。它能挡住多出一列的情况但属于边缘用例任务书的最低测试要求里没有这一项。我没做但我知道自己放弃了什么遇到多列的文件我的程序会接受而不是拒绝。这个决定我记在 AI 交互记录里了。完全拒绝的是那套整体重写方案。理由不是它不好是它超出我现阶段能掌握的范围。我把它当成一次学习知道了有strtod这种更严谨的做法知道了浮点数 NaN 的特性但代码还是用我自己能讲清楚的版本。这件事给我的启发第一AI 的建议要分类看。有些是必须改的正确性问题比如除零、数组越界这些要改有些是更工程化的做法比如用strtod代替sscanf这些是进阶方向可以知道但不一定要马上用还有些是过度设计对当前场景没有实际收益。第二知道自己放弃了什么比全都照做更能体现判断力。任务书要求的 AI 交互记录里有一栏是采纳、修改或拒绝的理由写清楚评估后认为属于边缘情况暂未采纳已知某类用例会被接受这是有理有据的取舍比含糊地全抄要好。第三验证的责任在人不在于模型。AI 给的代码能编译不等于正确能跑通也不等于符合需求。我那个 count 没清零的 bug程序照常运行、数字照常打印只有拿不同输入对比测试才暴露出来。编译器查不出逻辑错误模型也不一定看得出只有自己跑测试。一条底线整个作业过程中我给自己定了一条线正式提交的源文件里的代码必须是我自己敲的而且每一行我都能说出它在干什么。AI 用来讲思路、解释报错、审查代码、提供测试建议这些都是明确允许的但代码本身要自己写。这条线不是形式主义。答辩的时候老师指着某一行问为什么这么写答得上来才算真的会了。测试、交付以及一个跨 IDE 的坑程序写完只是完成了一半这份作业的后半程是测试和交付。这篇记录这部分做了什么以及中间踩到的一个环境坑。测试要覆盖正常和异常任务书里给了一张最低测试要求表一共八项每一项都写清了预期行为。测试的时候要记录输入样本、实际输出、预期输出和是否通过不能只凭能编译、能运行判断正确。八项分别是合法 CSV 能读取并显示摘要文件不存在时提示打开失败且不崩溃数据为空时拒绝训练标签为 2 或 -1 时拒绝比例特征为 1.3 时拒绝包含非数字字段时报告格式错误模型尚未加载时拒绝无效预测模型保存后重新加载同一输入的预测结果要一致。老师还额外给了十几份故意做坏的测试文件对应空文件、非法标签、比例越界、熵越界、非数字、缺失字段、多余列、空白行等各种情况。这些文件不是装饰是拿来验证异常处理真的生效的。我自己加测了一项连续加载不同的文件。就是这一项暴露了count没清零的 bug读空文件时仍然显示上次的条数。一个跨 IDE 的坑我把代码发给同组的同学他用 Visual Studio 打开编译通过运行却提示找不到文件。我这边同样的代码完全正常。原因不是代码是相对路径。../data/sample.csv这种写法是相对于程序运行时所在目录的不同 IDE 运行程序时默认的目录不一样。CLion 下程序的工作目录是源码所在目录所以能找到Visual Studio 默认用的是项目文件所在目录../data指过去根本没有东西。在 Visual Studio 里的解决办法是新建空项目把 .c 文件加进去然后右键项目而不是右键文件打开属性在配置属性 - 调试里把工作目录改成源码所在的完整路径。还有个更省事的办法运行的时候直接输入文件的绝对路径从盘符写到文件名不管什么 IDE、工作目录在哪都能找到。另外要注意的是直接把 .c 文件拖进 Visual Studio 打开属于杂项文件没有项目属性页里是找不到调试选项的必须先建项目。交付时要给什么代码之外要提供的是编译运行说明这部分正好是实验报告里运行环境、编译方法与系统展示那一节的内容。编译命令是gcc -stdc11 -O2 -Wall -Wextra -pedantic recognizer_starter.c -lm -o recognizer.exe-lm是链接数学库预测函数里用到了exp。还要说明文件结构不能被打乱因为程序按相对路径读数据。如果需要把项目发给别人整个文件夹打包成压缩包再传聊天工具一般不支持直接发送文件夹而且打包能保住目录结构。如果对方只是想看效果也可以直接给编译好的 exe双击运行时系统会把工作目录设为 exe 所在的目录不需要任何配置。报告和个人记录实验报告的结构任务书里给了建议项目背景与安全边界、总体设计与数据结构、关键模块实现、测试与结果分析、AI 协作记录与团队分工、总结反思。正文重点解释关键代码完整源码作为附件单独提交。结果数据必须来自实际运行不能套用演示值。个人要另交三组 AI 交互记录和一份反思。记录要包含原始提示词、模型给的关键建议、自己采纳或拒绝的理由、以及用什么方式验证的。反思要写清楚 AI 在哪些环节提供了帮助、哪些建议经过人工修改、为什么必须验证 AI 生成的程序、误报和漏报可能带来什么后果。最后一项容易被忽略所有分类输出都要注明仅作教学性判断不能据此宣称具备真实的恶意代码检测能力。总结回头看这整个项目技术上用到的是文件读写、结构体数组、循环和函数都是课程内的内容难的是把它们组织成一个完整的、能应对异常输入的程序。更有价值的其实是另外两件事一是养成了写完就测的习惯编译器查不出的错误只能靠测试发现二是学会了跟 AI 协作的边界用它提效但保留自己的判断交付的东西必须自己讲得清楚。