注释转换
将C语言的注释转化为C++注释
总共有5个状态:
正常代码、遇到/、C风格注释、C++风格注释、遇到*
- 转换的思路
正常代码(遇到/) --> 遇到/ ,否则将继续处于正常代码
遇到/,如果遇到*进入C注释状态、如果遇到/进入C++注释状态、如果不是这两种那就回到正常代码
C注释状态,如果遇到*,进入遇到*状态,否则继续在C注释状态
C++注释状态,遇到\n进入正常代码,否则保持C++注释状态
遇到*,遇到/进入正常代码状态,遇到*继续在遇到*状态,遇到(*+ch)进入C注释状态
- 注意
1.进入C注释状态后,要判断是否有\n,如果遇到将输入\n和//
2.进入*状态遇到/后,要判断下一个字符是否为\n,如果不是则要输出一个\n,若是,则直接输出,查看完下一个字符后要归还
3.C风格注释遇到*之后,如果没有遇到/则要将刚才遇到的那个*输出
CommentCnvert.h代码
#ifndef __CommentConvert_H__
#define __CommentConvert_H__
#include <stdio.h>
#include <stdlib.h>
typedef enum State
{
CODE, //正常代码
M_XIE_GANG, //遇到/
CCODE, //C风格注释
CPPCODE, //C++风格注释
CM_XING //遇到*
} State;
void CommentConvertMachine(FILE* pfread, FILE* pfwrite);
#endif // !__CommentConvert_H__
CommentConvert.c
#include "CommentConvert.h"
void CommentConvertMachine(FILE* pfread, FILE* pfwrite)
{
// 当前状态, CODE 是初始状态
State state = CODE;
int ch;
int nextch;
while (1)
{
// 从输入文件依次读出一个字符
ch = fgetc(pfread);
// 处理读完文件的情况
if (ch == EOF)
{
break;
}
// 根据当前状态 + 读到的字符,决定下个状态
switch (state)
{
case CODE:
if (ch == '/')
{
state = M_XIE_GANG;
}
fputc(ch, pfwrite);
break;
case M_XIE_GANG:
if (ch == '*')
{
state = CCODE;
fputc('/',pfwrite);
}
else if (ch == '/')
{
state = CPPCODE;
fputc(ch, pfwrite);
}
else
{
state = CODE;
fputc(ch, pfwrite);
}
break;
case CCODE:
if (ch == '*')
{
state = CM_XING;
}
else
{
fputc(ch, pfwrite);
if (ch == '\n')
{
fprintf(pfwrite, "//");
}
}
break;
case CPPCODE:
if (ch == '\n')
{
state = CODE;
}
fputc(ch, pfwrite);
break;
case CM_XING:
if (ch == '/')
{
state = CODE;
nextch = fgetc(pfread);
if (nextch != '\n')
{
fputc('\n', pfwrite);
}
ungetc(nextch, pfread);
}
else if (ch != '*')
{
state = CCODE;
fputc('*', pfwrite);
fputc(ch, pfwrite);
}
else
{
fputc('*', pfwrite);
}
break;
}
}
}
test.c
#include "CommentConvert.h"
//有限状态机(Finite State Machine)
void test()
{
FILE* pfread = NULL;
FILE* pfwrite = NULL;
pfread = fopen("input.c","r");
pfwrite = fopen("output.c", "w");
if (pfread == NULL)
{
perror("fopen input");
exit(EXIT_FAILURE);
}
if (pfwrite == NULL)
{
perror("fopen output");
fclose(pfread);
exit(EXIT_FAILURE);
}
CommentConvertMachine(pfread,pfwrite);
fclose(pfread);
fclose(pfwrite);
pfread = NULL;
pfwrite = NULL;
}
int main()
{
test();
return 0;
}
测试文件input.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++注释问题
// /*xxxxxxxxxxxx*/