注释转换。对于一个项目有多个人来写代码,如果每个人的代码注释风格不一样,有的人要用C注释风格,有的人用C++注释风格这就导致了,对于阅读源代码的人的不方便的问题。因此才会出现注释转换的这个东西。
本注释转换将所有程序的注释全部转换成C++代码的注释风格。
首先列出所有可能出现的情况:
// 1.一般情况
int num = 0;
/* int i = 0; */
// 2.换行问题
/* int i = 0; */int j = 0;
/* int i = 0; */
int j = 0;
// 3.匹配问题
/*int i = 0;/*xxxxx*/
// 4.多行注释问题
/*
int i=0;
int j = 0;
int k = 0;
*/int k = 0;
// 5.连续注释问题
/**//**/
// 6.连续的**/问题
/***/
// 7.C++注释问题
// /*xxxxxxxxxxxx*/
对于这么多的情况来进行注释转化,首先写程序一个个案例进行测试最后在将所有进行测试。
想法:状态机
运用状态机来进行实现:如图:
运用状态机对各种情况进行了分析。
接下来看看代码:分成了三个部分,头文件CommentConvert.h,功能源文件CommentConvert.c,测试源文件test.c
CommentConvert.h
#ifndef __CommentConvert_H__
#define __CommentConvert_H__
#include <stdio.h>
#include <stdlib.h>
enum State //状态,四种,无注释状态,c注释,cpp注释,结束状态
{
NUL_STATE,
C_STATE,
CPP_STATE,
END_STATE
};
void DoNulState(FILE* pfIn, FILE* pfOut, enum State *state);//无注释
void DoCState(FILE* pfIn, FILE* pfOut, enum State *state);//c注释
void DoCppState(FILE* pfIn, FILE* pfOut, enum State *state);//cpp注释
void CommentConvert(FILE* pfIn, FILE* pfOut);//注释转换
#endif //__CommentConvert_H__
CommentConvert.c
#include "CommentConvert.h"
void DoNulState(FILE* pfIn, FILE* pfOut, enum State *state) //无注释状态
{
int frist = fgetc(pfIn);
switch (frist)
{
case '/':
{
int second = fgetc(pfIn);
switch (second)
{
case '/':
{
fputc(frist, pfOut);
fputc(second, pfOut);
*state = CPP_STATE;
break;
}
case '*':
{
fputc('/', pfOut);
fputc('/', pfOut);
*state = C_STATE;
break;
}
default:
{
fputc(frist, pfOut);
fputc(second, pfOut);
*state = NUL_STATE;
break;
}
}
}
break;
case EOF:
//fputc(frist, pfOut);
*state = END_STATE;
break;
default:
fputc(frist, pfOut);
*state = NUL_STATE;
break;
}
}
// // 1.一般情况
// int num = 0;
// /* int i = 0; */
//
// // 2.换行问题
// /* int i = 0; */int j = 0;
// /* int i = 0; */
// int j = 0;
//
// // 3.匹配问题
// /*int i = 0;/*xxxxx*/
//
// // 4.多行注释问题
// /*
// int i=0;
// int j = 0;
// int k = 0;
// */int k = 0;
//
// // 5.连续注释问题
// /**//**/
//
// // 6.连续的**/问题
// /***/
//
// // 7.C++注释问题
// // /*xxxxxxxxxxxx*/
void DoCState(FILE* pfIn, FILE* pfOut, enum State *state)//c注释状态 /* */
{
int frist = fgetc(pfIn);
switch (frist)
{
case '*':
{
int second = fgetc(pfIn);
switch (second)
{
case '/':
{
int third = fgetc(pfIn);//出现/* */\n情况,情况1
if (third == '\n')
{
fputc(third, pfOut);
}
else if (third != '\n')//出现/* */int i = 0;情况,情况2
{
fseek(pfIn, -1, SEEK_CUR);
fputc('\n', pfOut);
}
}
*state = NUL_STATE;
break;
case '*':
{
fseek(pfIn, -1, SEEK_CUR); //出现/***/情况,情况6
fputc(frist, pfOut);
}
*state = C_STATE;
break;
default:
fputc(frist, pfOut);
fputc(second, pfOut);
*state = C_STATE;
break;
}
}
break;
case '\n':
{
fputc(frist, pfOut); //出现/*\n的情况,情况4
fputc('/', pfOut);
fputc('/', pfOut);
}
*state = C_STATE;
break;
default:
fputc(frist, pfOut); //出现/*ahdkj/*jlj*/情况,情况3
*state = C_STATE;
break;
}
}
void DoCppState(FILE* pfIn, FILE* pfOut, enum State *state)//c++注释状态 //
{
int frist = fgetc(pfIn);
switch (frist)
{
case '\n':
fputc(frist, pfOut);
*state = NUL_STATE;
break;
case EOF:
//fputc(frist, pfOut);
*state = END_STATE;
break;
default:
fputc(frist, pfOut);
*state = CPP_STATE;
break;
}
}
void CommentConvert(FILE* pfIn, FILE* pfOut)//注释转换
{
enum State state = NUL_STATE;
while (state != END_STATE)
{
switch (state)
{
case NUL_STATE:
DoNulState(pfIn, pfOut, &state);
break;
case C_STATE:
DoCState(pfIn, pfOut, &state);
break;
case CPP_STATE:
DoCppState(pfIn, pfOut, &state);
break;
default:
break;
}
}
}
test.c
#include "CommentConvert.h"
void test()
{
FILE* pfIn = NULL;
FILE* pfOut = NULL;
pfIn = fopen("input.c", "r"); //以读的方式打开
if (pfIn == NULL)
{
perror("open file for read");
exit(EXIT_FAILURE);
}
pfOut = fopen("output.c", "w"); //以写的方式打开
if (pfOut == NULL)
{
fclose(pfIn);//如果output文件没有打开的话,就要将已经打开的input文件进行关闭
pfIn = NULL;
perror("open file for write");
exit(EXIT_FAILURE);
}
CommentConvert(pfIn, pfOut);
//关闭所有文件
fclose(pfIn);
pfIn = NULL;
fclose(pfOut);
pfOut = NULL;
}
int main()
{
test();
return 0;
}
这就是所有代码。如有错误请指出。