本程序可以比较任意两个C语言源代码文件的结构相似度,用于:
- 作业查重
- 代码抄袭检测
- 代码重复度分析
cd CourseDesignTasks
mkdir build
cd build
cmake ..
make./final_app <文件1路径> <文件2路径>./final_app codes/code1.c codes/code2.c./final_app /path/to/student1.c /path/to/student2.c./final_app main.c backup.c./final_app C:\Users\张三\作业1.c C:\Users\李四\作业1.c程序会输出详细的处理过程:
╔════════════════════════════════════════════════╗
║ 代码相似度检测系统 v1.0 ║
╚════════════════════════════════════════════════╝
[阶段1] 读取源文件...
✓ 文件读取成功
- codes/code1.c: 2856 字节
- codes/code2.c: 856 字节
[阶段2] 代码结构分析...
=== 处理文件: codes/code1.c ===
[步骤1] 词法分析中...
✓ 共识别 450 个Token
[步骤2] 语法分析中...
✓ AST构建成功
[步骤3] AST序列化中...
✓ 序列化完成,生成 1200 个标记
=== 处理文件: codes/code2.c ===
[步骤1] 词法分析中...
✓ 共识别 120 个Token
[步骤2] 语法分析中...
✓ AST构建成功
[步骤3] AST序列化中...
✓ 序列化完成,生成 350 个标记
[阶段3] 计算相似度...
[步骤4] 计算编辑距离...
✓ 编辑距离: 850
✓ 序列长度: A=1200, B=350
╔════════════════════════════════════════════════╗
║ 相似度分析结果 ║
╠════════════════════════════════════════════════╣
║ 文件1: codes/code1.c ║
║ 文件2: codes/code2.c ║
╠════════════════════════════════════════════════╣
║ 结构相似度: 29.17% ║
╠════════════════════════════════════════════════╣
║ 判定: 【不相似】代码结构差异大 ║
╚════════════════════════════════════════════════╝
| 相似度范围 | 判定结果 | 说明 |
|---|---|---|
| ≥ 90% | 【高度相似】可能存在抄袭 | 代码结构几乎完全相同 |
| 60% - 90% | 【中度相似】需人工审查 | 有较多相似的结构 |
| 30% - 60% | 【低度相似】部分结构相同 | 可能使用了相似算法 |
| < 30% | 【不相似】代码结构差异大 | 基本是不同的代码 |
A: 可以!文件路径完全由命令行参数指定,不限于codes目录。
A: 支持任何C语言源代码文件(.c, .h等文本文件)。
A: 可以,但建议使用英文路径以避免编码问题。
A: 可以!只要提供正确的路径即可。
A: 程序会显示用法说明并退出。
$ ./final_app
用法: ./final_app <文件1.c> <文件2.c>
示例:
./final_app codes/code1.c codes/code2.c程序采用以下步骤检测相似度:
- 词法分析:将代码转换为Token序列,同时归一化变量名
- 语法分析:构建抽象语法树(AST),捕捉代码结构
- 序列化:将AST转换为标准化的字符串序列
- 相似度计算:使用Levenshtein编辑距离算法计算序列差异
这种方法可以:
- ✅ 忽略变量名差异
- ✅ 忽略格式和空格
- ✅ 忽略注释
- ✅ 关注代码结构和逻辑
因此即使学生改了变量名、调整了格式,只要逻辑相同,仍能检测出高相似度。
./final_app codes/code1.c codes/code2.c预期结果:相似度很低(< 30%)
创建两个文件:
// test1.c
int main() {
int sum = 0;
for (int i = 0; i < 10; i++) {
sum += i;
}
return sum;
}
// test2.c
int main() {
int total = 0;
for (int j = 0; j < 10; j++) {
total += j;
}
return total;
}./final_app test1.c test2.c预期结果:相似度很高(> 90%),因为结构完全相同
- 版本:v2.0
- 语言:C11
- 依赖:标准C库