第79讲:输出净化——剔除AI废话,只保留纯净C代码

📅 2026/8/8 11:15:59
第79讲:输出净化——剔除AI废话,只保留纯净C代码
第79讲输出净化——剔除AI废话只保留纯净C代码专栏地址嵌入式程序开发实战嵌入式双范式AI编程嵌入式开发必掌握嵌入式求职面试技术资料前言为什么需要净化AI输出为什么重要AI输出通常包含大量非代码内容解释说明AI喜欢解释代码功能、原理、用法示例代码AI可能提供多个示例只需要其中一个注意事项AI会列出使用注意事项、限制条件对话填充AI会说好的、这是代码等填充语这些内容对理解有帮助但对代码集成是干扰复制困难需要手动从大量文本中提取代码格式混乱代码块、解释文本混在一起容易遗漏可能遗漏部分代码或包含多余内容自动化困难难以用脚本自动提取代码输出净化的作用从AI输出中自动提取纯净的C代码剔除所有非代码内容方便集成到工程。新手常见困惑困惑1“AI输出这么多内容如何快速提取代码”困惑2“如何判断哪些是代码、哪些是解释”困惑3“提取的代码格式不对怎么办”困惑4“有没有自动化工具帮助净化输出”本文结构本文结构入门阶段进阶阶段高级阶段AI输出的结构代码识别方法基础净化模板手动净化技巧脚本净化工具格式修正方法批量净化工作流净化质量验证净化工具集成第一部分入门阶段——建立整体认知1.1 AI输出的结构典型AI输出结构【典型AI输出结构】 一、开场白 好的我来帮你生成USART驱动代码。 二、代码块 c /** * file usart_driver.c * brief USART驱动实现 */ #include usart_driver.h void usart_init(void) { // 初始化代码 }三、解释说明这段代码实现了USART初始化功能包括配置GPIO引脚配置USART参数使能USART…四、使用示例使用示例usart_init();usart_send(Hello,5);五、注意事项注意事项调用前需确保系统时钟已配置波特率需根据实际需求修改…六、结束语“希望这段代码对你有帮助”#### 需要提取的内容 | 内容类型 | 是否需要 | 提取方法 | |----------|----------|----------| | 代码块c ... | 是 | 提取代码块内容 | | 代码中的注释 | 是 | 保留注释 | | 解释说明文本 | 否 | 剔除 | | 使用示例 | 视情况 | 可能需要 | | 注意事项 | 否 | 剔除或单独保存 | | 开场白/结束语 | 否 | 剔除 | ### 1.2 代码识别方法 #### 方法一代码块标记识别 AI通常使用Markdown代码块标记代码【代码块标记识别】Markdown代码块格式[代码内容]识别方法查找c 或C 标记提取标记后的内容查找 结束标记提取标记之间的内容示例输入这是USART驱动代码voidusart_init(void){// 初始化}希望对你有帮助。输出void usart_init(void){// 初始化}#### 方法二语法特征识别 通过C语言语法特征识别代码【语法特征识别】C语言特征包含#include指令包含函数定义返回类型 函数名(参数)包含变量定义类型 变量名;包含结构体定义typedef struct包含宏定义#define识别方法按行分析文本检测C语言特征标记代码行提取连续代码行示例输入“初始化函数如下void usart_init(void){// 初始化}这个函数会初始化USART。”输出void usart_init(void){// 初始化}### 1.3 基础净化模板 #### 模板一请求纯净输出Prompt【请求纯净输出】请在生成代码时遵循以下格式一、代码输出格式只输出代码不要包含解释、示例、注意事项。二、代码块标记使用Markdown代码块标记[完整代码]三、禁止内容禁止输出开场白、结束语禁止输出代码解释禁止输出使用示例除非明确要求禁止输出注意事项除非明确要求四、输出示例正确voidusart_init(void){// 初始化代码}错误好的这是USART初始化代码voidusart_init(void){// 初始化代码}这个函数会初始化USART…#### 模板二分文件输出Prompt【分文件输出】请按以下格式输出多个文件一、头文件[头文件完整内容]二、源文件[源文件完整内容]三、输出要求每个文件单独一个代码块代码块标记明确文件类型h或c不包含任何解释文本--- ## 第二部分进阶阶段——深入理解原理 ### 2.1 手动净化技巧 #### 技巧一快速定位代码块【快速定位代码块】步骤搜索c 或C 标记定位代码块起始位置搜索 结束标记定位代码块结束位置复制中间内容快捷键大多数编辑器CtrlF搜索 cCtrlC复制选中内容CtrlV粘贴到目标文件注意可能有多个代码块选择需要的检查代码块是否完整有开始和结束标记检查代码块类型c、h、markdown等#### 技巧二剔除行内解释【剔除行内解释】AI有时会在代码中插入解释示例voidusart_init(void){// 这里配置GPIO引脚GPIO_InitTypeDef GPIO_InitStructure;// 定义GPIO配置结构体// 这里配置USART参数USART_InitTypeDef USART_InitStructure;// 定义USART配置结构体}净化方法保留功能性注释说明代码作用剔除废话注释如这里配置…剔除行尾注释如果只是解释净化后voidusart_init(void){GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;}### 2.2 脚本净化工具 #### Python净化脚本 python # output_cleaner.py - AI输出净化脚本 import re import sys class OutputCleaner: def __init__(self): self.code_blocks [] def extract_code_blocks(self, text): 提取Markdown代码块 # 匹配 c 或 h 或 C 或 H pattern r([chCH])\n(.*?)\n matches re.findall(pattern, text, re.DOTALL) for lang, code in matches: self.code_blocks.append({ language: lang.lower(), code: code }) return self.code_blocks def remove_inline_comments(self, code): 剔除行内废话注释 lines code.split(\n) cleaned_lines [] for line in lines: # 保留功能性注释剔除废话注释 # 简单规则如果注释只是解释剔除 if // in line: code_part, comment_part line.split(//, 1) # 如果代码部分不为空保留 if code_part.strip(): cleaned_lines.append(code_part.rstrip()) # 如果注释是功能性注释保留 elif any(keyword in comment_part for keyword in [TODO, FIXME, NOTE, 参数, 返回]): cleaned_lines.append(line) else: cleaned_lines.append(line) return \n.join(cleaned_lines) def format_code(self, code): 格式化代码 # 简单格式化统一缩进为4空格 lines code.split(\n) formatted_lines [] for line in lines: # 替换Tab为4空格 line line.replace(\t, ) formatted_lines.append(line) return \n.join(formatted_lines) def clean(self, text): 完整净化流程 # 提取代码块 code_blocks self.extract_code_blocks(text) # 净化每个代码块 cleaned_blocks [] for block in code_blocks: code block[code] # code self.remove_inline_comments(code) code self.format_code(code) cleaned_blocks.append({ language: block[language], code: code }) return cleaned_blocks def save_to_files(self, cleaned_blocks, output_dir): 保存到文件 import os os.makedirs(output_dir, exist_okTrue) for i, block in enumerate(cleaned_blocks): if block[language] h: filename foutput_{i}.h else: filename foutput_{i}.c filepath os.path.join(output_dir, filename) with open(filepath, w) as f: f.write(block[code]) print(f保存{filepath}) def main(): if len(sys.argv) 2: print(用法python output_cleaner.py 输入文件 [输出目录]) sys.exit(1) input_file sys.argv[1] output_dir sys.argv[2] if len(sys.argv) 2 else ./output with open(input_file, r, encodingutf-8) as f: text f.read() cleaner OutputCleaner() cleaned_blocks cleaner.clean(text) print(f提取到{len(cleaned_blocks)}个代码块) cleaner.save_to_files(cleaned_blocks, output_dir) if __name__ __main__: main()2.3 格式修正方法常见格式问题【常见格式问题】 问题一缩进不一致 示例 c void function(void) { if (condition) { // 缩进混乱 } }修正统一缩进为4空格问题二大括号风格不一致示例voidfunction(void){if(condition){// KR风格}}修正统一为Allman风格大括号独占一行问题三行宽超限示例voidfunction_with_very_long_name(intparameter1,intparameter2,intparameter3,intparameter4)修正换行保持行宽在80字符以内问题四空行过多或过少示例voidfunction_a(void){// 函数a}voidfunction_b(void){// 函数b}修正函数间空一行逻辑块间空一行#### 格式修正脚本 python # format_fixer.py - 格式修正脚本 import re def fix_indentation(code): 修正缩进 lines code.split(\n) fixed_lines [] for line in lines: # 替换Tab为4空格 line line.replace(\t, ) # 统一缩进为4空格的倍数 stripped line.lstrip() if stripped: indent_level (len(line) - len(stripped)) // 4 fixed_lines.append( * indent_level stripped) else: fixed_lines.append() return \n.join(fixed_lines) def fix_brace_style(code): 修正大括号风格 # 将KR风格转换为Allman风格 # 简单实现在{前换行 code re.sub(r([^\n])\s*\{, r\1\n{, code) return code def fix_line_width(code, max_width80): 修正行宽 lines code.split(\n) fixed_lines [] for line in lines: if len(line) max_width: # 简单换行在逗号后换行 parts [] current for part in line.split(,): if len(current part) max_width: parts.append(current.rstrip()) current part , else: current part , parts.append(current.rstrip(,)) fixed_lines.extend(parts) else: fixed_lines.append(line) return \n.join(fixed_lines) def fix_blank_lines(code): 修正空行 # 删除多余空行 code re.sub(r\n{3,}, \n\n, code) # 确保函数间有空行 code re.sub(r\}\n([^\n]), r}\n\n\1, code) return code def fix_all(code): 修正所有格式问题 code fix_indentation(code) code fix_brace_style(code) code fix_line_width(code) code fix_blank_lines(code) return code第三部分高级阶段——掌握复杂应用3.1 批量净化工作流工作流程否是AI生成输出保存到临时文件运行净化脚本提取代码块格式修正保存到目标文件编译验证编译是否通过修正格式错误净化完成批量净化脚本# batch_cleaner.py - 批量净化脚本importosimportglobfromoutput_cleanerimportOutputCleanerfromformat_fixerimportfix_allclassBatchCleaner:def__init__(self,input_dir,output_dir):self.input_dirinput_dir self.output_diroutput_dir self.cleanerOutputCleaner()defprocess_file(self,input_file):处理单个文件withopen(input_file,r,encodingutf-8)asf:textf.read()# 净化cleaned_blocksself.cleaner.clean(text)# 格式修正forblockincleaned_blocks:block[code]fix_all(block[code])returncleaned_blocksdefprocess_all(self):批量处理所有文件os.makedirs(self.output_dir,exist_okTrue)# 查找所有输入文件input_filesglob.glob(os.path.join(self.input_dir,*.txt))forinput_fileininput_files:print(f处理{input_file})# 净化cleaned_blocksself.process_file(input_file)# 保存base_nameos.path.splitext(os.path.basename(input_file))[0]fori,blockinenumerate(cleaned_blocks):ext.hifblock[language]helse.coutput_fileos.path.join(self.output_dir,f{base_name}_{i}{ext})withopen(output_file,w,encodingutf-8)asf:f.write(block[code])print(f 保存{output_file})print(批量净化完成)defmain():input_dir./ai_outputoutput_dir./cleaned_codecleanerBatchCleaner(input_dir,output_dir)cleaner.process_all()if__name____main__:main()3.2 净化质量验证验证清单【净化质量验证清单】 一、完整性验证 - [ ] 所有代码块是否都提取 - [ ] 代码是否完整没有截断 - [ ] 注释是否保留 二、格式验证 - [ ] 缩进是否统一 - [ ] 大括号风格是否统一 - [ ] 行宽是否超限 - [ ] 空行是否合理 三、语法验证 - [ ] 是否能编译通过 - [ ] 是否有语法错误 - [ ] 是否有未闭合的大括号 四、内容验证 - [ ] 是否包含非代码内容 - [ ] 是否包含废话注释 - [ ] 是否包含解释文本3.3 净化工具集成集成到开发流程【净化工具集成】 一、集成到AI调用流程 1. 调用AI生成代码 2. 自动净化输出 3. 保存净化后的代码 4. 编译验证 二、集成到CI/CD流程 1. 代码提交时自动净化 2. 净化后代码格式检查 3. 净化后代码编译检查 4. 净化报告生成 三、集成到编辑器 1. 粘贴AI输出时自动净化 2. 快捷键触发净化 3. 净化预览 4. 净化后自动格式化总结入门要点AI输出结构开场白、代码块、解释、示例、注意事项、结束语代码识别方法代码块标记识别、语法特征识别基础模板请求纯净输出Prompt、分文件输出Prompt进阶要点手动净化快速定位代码块、剔除行内解释脚本净化Python净化脚本、自动提取代码块格式修正缩进修正、大括号风格修正、行宽修正、空行修正高级要点批量净化批量净化工作流、批量净化脚本质量验证完整性验证、格式验证、语法验证、内容验证工具集成集成到AI调用流程、CI/CD流程、编辑器记住这些原则净化即提纯从AI输出中提取纯净代码剔除干扰内容自动化优先使用脚本自动净化提高效率验证必须净化后必须验证确保代码正确集成工作流将净化工具集成到开发流程无缝衔接下一讲预告第80讲将深入讲解附赠嵌入式双范式全套可复制Prompt库提供完整的Prompt模板库方便直接使用。