项目——注释转换工具
一、简历上写的
二、为什么要做这个项目?
在一个大型工程当中,由于代码人员的多样性,使得代码的注释风格不同。然而在发布版本中,注释风格应该保持一致,以便于其他人员在后期的使用和维护。 由此,产生了如下的需求:
实现对一个C/C++语言程序源文件中注释的转换功能(在这里 我们实现的是C++注释转换为标准C语言注释)
三、分析一下这个项目:
四、总结:(具体七种情况)
// 1.一般情况
/* 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++注释问题
// /*xxxxxxxxxxxxxxxxxxxx*/
五、什么是有限状态机?
这里只列举了几种情况,当然还有更多。所以想要单纯的通过if-else语句判断是很麻烦很麻烦的。由此,我们就想通过某种方法将这么多的复杂情况简化为几种状态,在这几种为数不多的状态里区分逻辑那就一目了然了。所以有限状态机来了。
有限状态机,(英语:Finite-state machine, FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。
往往将抽象的状态转化为状态转移图:
按注释风格将代码分为几种状态:——包括注释的嵌套
非注释代码称为无状态,c风格注释称为C转态,C++风格注释称为CPP状态,文件结束称为END状态。
箭头旁边的标注代表状态转换的条件,例如无状态指向C转态的箭头,意义为当在无状态下,遇到 '/*'则切换为C状态。
六、项目具体是如何实现的?——看代码
七、你怎么去测试的?——看简历
八、注释转换代码
commentcovert.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"commentcovert.h"
StateType state = NULL_STATE;
void DoNULL_STATE(FILE* read, FILE* write)
{
int first = fgetc(read);
int second = 0;
switch (first)
{
case '/':
second = fgetc(read);
if (second == '*')
{
fputc(first, write);
fputc('/', write);
state = C_STATE;
}
else if (second == '/')
{
fputc(first, write);
fputc(second, write);
state = CPP_STATE;
}
else
{
fputc(first, write);
fputc(second, write);
}
break;
case EOF:
{
state = END_STATE;
break;
}
default:
{
fputc(first, write);
break;
}
}
}
void DoC_STATE(FILE* read, FILE* write)
{
int first = fgetc(read);
int second = 0;
switch (first)
{
case '*':
second = fgetc(read);
if (second == '/')
{
state = NULL_STATE;
}
break;
case EOF:
fputc(first, write);
state = END_STATE;
break;
case '/n':
state = NULL_STATE;
break;
default:
{
fputc(first, write);
break;
}
}
}
void DoCPP_STATE(FILE* read, FILE* write)
{
int first = fgetc(read);
int second = 0;
switch (first)
{
case '/n':
state = NULL_STATE;
break;
case EOF:
fputc(first, write);
state = END_STATE;
break;
default:
{
fputc(first, write);
break;
}
}
}
void ConvertWork(FILE* read, FILE* write)
{
state = NULL_STATE;
while (state != END_STATE)
{
switch (state)
{
case NULL_STATE:
DoNULL_STATE(read, write);
break;
case C_STATE:
DoC_STATE(read, write);
break;
case CPP_STATE:
DoCPP_STATE(read, write);
break;
}
}
}
void CommentCovert()
{
FILE* pWrite = NULL;
FILE* pRead = fopen(INPUTFILENAME, "r");
if (pRead == NULL)
{
perror("open file for read");
exit(EXIT_FAILURE);
}
pWrite = fopen(OUTPUTFILENAME, "w");
if (pWrite == NULL)
{
fclose(pRead);
perror("open file for write");
exit(EXIT_FAILURE);
}
ConvertWork(pRead, pWrite);
fclose(pRead);
fclose(pWrite);
}
commentcovert.h
#define _CRT_SECURE_NO_WARNINGS 1
#ifndef __COMMENT_CONVERT_H__
#define __COMMENT_CONVERT_H__
#include<stdio.h>
#include<stdlib.h>
typedef enum CONVERT_STATE
{
NULL_STATE,
C_STATE,
CPP_STATE,
END_STATE
}StateType;
#define INPUTFILENAME "input.c"
#define OUTPUTFILENAME "output.c"
void CommentCovert();
void ConvertWork(FILE* read, FILE* write);
void DoNULL_STATE(FILE* read, FILE* write);
void DoC_STATE(FILE* read, FILE* write);
void DoCPP_STATE(FILE* read, FILE* write);
#endif __COMMENT_CONVERT_H__
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"commentcovert.h"
void test()
{
CommentCovert();
}
int main()
{
test();
return 0;
}