注释转换(c++风格转c风格)
来源:互联网 发布:程序员最想去的公司 编辑:程序博客网 时间:2024/06/08 12:18
介绍
c语言风格的注释为块注释,c++风格为行注释。
/*块注释*///行注释
在项目中人们喜欢用不同风格的注释,或者两种风格的注释混用,这并不影响代码的功能,但是在一些工具当中要求代码的注释风格统一为c或者c++风格。
所以写了一个处理文件注释的代码。
分析
我们使用了状态机的概念,即在对文件中各个字符检测的时候遇到特定的字符对全局变量赋不同的状态值,来代表代码所处的状态,下面为不同状态间相互转换的示意图。
例如
//Xi/*You*/Linux//Group
首先检测到了”//”这两个字符,进入c++状态,我们将”//”替换为”/* “然后将后面的”/ “,” /”,”//”换成两个空格代替,然后在最后加上”*/”.转换后如下
/*Xi You Linux Group*/
c语言状态下同理。
需要注意的是还有一种状态是引号的状态,在图中并未列出,在” “中的两种注释风格的注释都是无效的,它们被当作字符串处理,所以在” “中的注释的字符原样输出并不进行处理
代码
convertcomment.h
#ifndef _CONVERTCOMMENT_H#define _CONVERTCOMMENT_Hint convertcomment(FILE *inputfile, FILE *outputfile);void eventpro(char ch);void eventpro_no(char ch);void eventpro_cpp(char ch);void eventpro_c(char ch);void eventpro_quo(char ch);#endif // _CONVERTCOMMENT_H
convert.c
#include <stdio.h>#include "convertcomment.h"int main(int argc, char *argv[]){ FILE *fpin = fopen("./src_file/input.c", "r"); if(NULL == fpin) { printf("open input.c fail.\n"); return -1; } FILE *fpout = fopen("./dest_file/output.c", "w"); if(NULL == fpout) { printf("open output.c fail.\n"); return -1; } convertcomment(fpin, fpout); fclose(fpin); fclose(fpout); printf("Commnet Convert Completion.......\n"); return 0;}
convertcomment.c
#include<stdio.h>#include "convertcomment.h"//定义状态typedef enum{ no_comment_state, c_comment_state, cpp_comment_state, quo_state, end_state}enum_state;//定义状态机typedef struct{ FILE *input; FILE *output; enum_state ulstate;}state_machine;//定义全局状态机state_machine g_state;int convertcomment(FILE *inputfile, FILE *outputfile){ if(inputfile==NULL || outputfile==NULL) { printf("invalid arugment inputfile or outputfile.\n"); return -1; } ///////////////////////////////////////////////////////// //初始化状态机 g_state.input = inputfile; g_state.output = outputfile; g_state.ulstate = no_comment_state; char ch; while(g_state.ulstate != end_state) { ch = fgetc(g_state.input); eventpro(ch); } return 0;}void eventpro(char ch){ switch(g_state.ulstate) { case no_comment_state: eventpro_no(ch); break; case c_comment_state: eventpro_c(ch); break; case cpp_comment_state: eventpro_cpp(ch); break; case quo_state: eventpro_quo(ch); break; }}void eventpro_no(char ch){ char nextch; switch(ch) { case '/': nextch = fgetc(g_state.input); if(nextch == '/') //C++ { fputc('/', g_state.output); fputc('*', g_state.output); g_state.ulstate = cpp_comment_state; } else if(nextch=='*') { fputc('/', g_state.output); fputc('*', g_state.output); g_state.ulstate = c_comment_state; } else { fputc(ch, g_state.output); fputc(nextch, g_state.output); } break; case '"': fputc('"', g_state.output); g_state.ulstate = quo_state; break; case EOF: g_state.ulstate = end_state; break; default: fputc(ch, g_state.output); break; }}void eventpro_c(char ch){ char nextch; switch(ch) { case '/': nextch = fgetc(g_state.input); if(nextch=='/') { fputc(' ', g_state.output); fputc(' ', g_state.output); } else { fputc(ch, g_state.output); fputc(nextch, g_state.output); } break; case '*': nextch = fgetc(g_state.input); if(nextch=='/') { fputc(ch, g_state.output); fputc(nextch, g_state.output); g_state.ulstate = no_comment_state; } else if(nextch=='*') { fseek(g_state.input,-1L,SEEK_CUR); //防止/* ***/这种情况 } else { fputc(ch, g_state.output); fputc(nextch, g_state.output); } break; case EOF: g_state.ulstate = end_state; break; default: fputc(ch, g_state.output); break; }}void eventpro_cpp(char ch){ char nextch; switch(ch) { case EOF: fputc('*', g_state.output); fputc('/', g_state.output); g_state.ulstate = end_state; break; case '/': nextch=fgetc(g_state.input); if(nextch=='/'||nextch=='*') { fputc(' ', g_state.output); fputc(' ', g_state.output); } else if(nextch=='\n') { fputc(ch, g_state.output); fputc('*', g_state.output); fputc('/', g_state.output); fputc('\n', g_state.output); g_state.ulstate = no_comment_state; } else { fputc(ch, g_state.output); fputc(nextch, g_state.output); } break; case '*': nextch=fgetc(g_state.input); if(nextch=='/') { fputc(' ', g_state.output); fputc(' ', g_state.output); } else { fputc(ch, g_state.output); fputc(nextch, g_state.output); } break; case '\n': fputc('*', g_state.output); fputc('/', g_state.output); fputc('\n', g_state.output); g_state.ulstate = no_comment_state; break; default: fputc(ch, g_state.output); break; }}void eventpro_quo(char ch){ char nextch; switch(ch) { case '\n': case '"': fputc(ch, g_state.output); g_state.ulstate = no_comment_state; break; case EOF: g_state.ulstate = end_state; break; default: fputc(ch, g_state.output); break; }}
makefile
cct:convert.o convertcomment.o gcc -o cct convert.o convertcomment.oconvert.o:convert.c gcc -o convert.o -c convert.cconvertcomment.o:convertcomment.c gcc -o convertcomment.o -c convertcomment.cclean: rm *.o cct
./src_file/input.c
//每个区由若干个内存块组成//每个区由若干个内存块组成,//每个块是4096个字节//int i = 0;*///*//*int i = 0;// /**/int i = 0;/* int i = 0; *//* */ /* int i = 0; //*/int j = 0; /* //每个区由若干个内存块组成,每个块是4096个字节 //每个块的第0个整数指向下个区 //所以是单链表结构 //所以每个区只有4092个字节存放真正的数据 */ /* int i = 0;*//*int j = 0; */ printf("/*Hello Linux! */"); /* *//* */int i =0;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 5//"abcdefghijklmn~~~~!!!!!!!!"char *str = "hello // world.";/*abc**///char *str = "hello /*123*/ xyz";
./src_file/output.c
/*每个区由若干个内存块组成*//*每个区由若干个内存块组成, 每个块是4096个字节*//*int i = 0; *//* int i = 0;*//* int i = 0;*//* int i = 0; *//* */ /* int i = 0; */int j = 0; /* 每个区由若干个内存块组成,每个块是4096个字节 每个块的第0个整数指向下个区 所以是单链表结构 所以每个区只有4092个字节存放真正的数据 */ /* int i = 0;*//*int j = 0; */ printf("/*Hello Linux! */"); /* *//* */int i =0;/* 5*//*"abcdefghijklmn~~~~!!!!!!!!"*/char *str = "hello // world.";/*abc**//*char *str = "hello 123 xyz";*/
阅读全文
0 0
- 注释转换(c++风格转c风格)
- 注释转换(C注释风格-C++注释风格)
- 注释转换(c风格转为c++风格)
- C语言项目:注释转换(C风格注释转换成C++风格注释)
- 注视转换 将C风格注释转换为C++风格
- 【小项目】注释风格转换(从C语言注释风格转换到C++注释风格)
- 将c风格的注释转换成cpp风格
- C语言编写注释风格转换
- C语言注释风格
- C语言注释风格
- C语言注释风格
- 注释转换—将C语言注释风格转换为C++注释风格
- C\C++注释风格转换(段注释转换为行注释)
- 小项目:简单注释转换(C风格转到C++风格)
- 注释转换(将C的注释风格转换为C++的)
- c语言实现代码C风格到C++风格的注释转换
- 状态机修改C++风格注释为C风格注释
- C注释风格转化为C++风格注释
- js闭包的用途
- 通过bundle在两个activity传递信息的零碎代码
- px、dp和sp,这些单位有什么区别?
- Java 引用类型的分类 -- 强软弱虚
- 模式的秘密——代理模式
- 注释转换(c++风格转c风格)
- Mybatis最入门---分页查询(拦截器分页原理及实现)
- java中子类继承父类时,是否继承构造函数
- Spring Boot 属性配置
- html之js操作元素属性
- SQL字符串转为Int表函数StringToIntArray
- cocos2d-x 3.10热更强制退出无法继续下载+IOS热更资源有空格热更出错的Bug解决方法
- 外卖App双列表联动
- PHP实现时间轴函数