用python写有种比较两程序是否相似的方法:将程序中控制结构信息按出现次序抽取出来形成一个控制流串,然后依据两个程序的控制流串来计算两个程序的相似度。 编写一程序,抽取一个C程序的控制流串。要求只考虑if, else, for, while, switch, case等控制流关键字,其它控制流不被考虑。被处理的C程序满足: 1. 能够通过C编译; 2. 一行可能有多条语句; 3. 注释、字符串常量及其它标识符中不含控制流关键字串; 【输入形式】 要处理的C程序保存在当前目录下,文件名为:in.c。 【输出形式】 按出现的先后顺序将控制流关键字串输出到当前目录下的out.txt文件中,各关键字串之间没有任何分隔符。若没有控制流关键字,则将No answer输出到文件中。
时间: 2024-02-25 19:54:41 浏览: 123
使用python语言,比较两个字符串是否相同的实例
以下是实现该功能的Python代码:
```python
import re
# 定义控制流关键字列表
control_keywords = ['if', 'else', 'for', 'while', 'switch', 'case']
# 读取输入文件
with open('in.c', 'r') as f:
code = f.read()
# 去除注释
code = re.sub(r'(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|(//.*)', '', code, flags=re.MULTILINE)
# 抽取控制流串
control_flow = []
for line in code.split('\n'):
line = line.strip()
if line:
# 去除行末注释
line = re.sub(r'//.*', '', line)
# 提取控制流关键字
for keyword in control_keywords:
if re.match(rf'^{keyword}\b', line):
control_flow.append(keyword)
# 输出结果到文件
if control_flow:
with open('out.txt', 'w') as f:
f.write(''.join(control_flow))
else:
with open('out.txt', 'w') as f:
f.write('No answer')
```
该程序首先读取输入文件 `in.c`,然后去除注释。接下来,程序按行读取代码,每行去除行末注释后提取出其中的控制流关键字,并将其添加到 `control_flow` 列表中。最后,程序将 `control_flow` 列表中的关键字串输出到文件 `out.txt` 中。如果 `control_flow` 列表为空,则输出 `No answer` 到文件中。
阅读全文