问题要求:将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++注释问题
// /*xxxxxxxxxxxx*/
// 8.C注释本身不匹配
/* int i = 0;
程序代码
#ifndef __COMMENT__H__
#define __COMMENT__H__
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#define READ_FILE_NAME "input.c"
#define WRITE_FILE_NAME "output.c"
typedef enum STATE
{
NULL_STATE,
C_STATE,
CPP_STATE,
END_STATE
}STATE;
void DoConvert(char* ReadFile, char* WriteFile);
void CommentConvert();
#endif
#include"CommentConvert.h"
STATE g_state = NULL_STATE;
void DoNullState(FILE* pfRead, FILE* pfWrite)
{
int first = 0;
int second = 0;
first = fgetc(pfRead);
switch (first)
{
case '/':
{
second = fgetc(pfRead);
if (second == '*')
{
fputc('/', pfWrite);
fputc('/', pfWrite);
g_state = C_STATE;
}
else if (second == '/')
{
fputc(first, pfWrite);
fputc(second, pfWrite);
g_state = CPP_STATE;
}
else
{
fputc(first, pfWrite);
fputc(second, pfWrite);
}
break;
}
case EOF:
{
g_state = END_STATE;
break;
}
default:
{
fputc(first, pfWrite);
break;
}
}
}
void DoCState(FILE* pfRead, FILE* pfWrite)
{
int first = 0;
int second = 0;
first = fgetc(pfRead);
switch (first)
{
case '*':
{
second = fgetc(pfRead);
if (second == '/')
{
fputc('\n', pfWrite);
g_state = NULL_STATE;
}
else
{
fputc(first,pfWrite);
ungetc(second,pfRead);
}
break;
}
case '\n':
{
fputc(first, pfWrite);
fputc('/', pfWrite);
fputc('/', pfWrite);
break;
}
case EOF:
{
g_state = END_STATE;
break;
}
default:
{
fputc(first, pfWrite);
break;
}
}
}
void DoCppState(FILE* pfRead, FILE* pfWrite)
{
int first = 0;
int second = 0;
first = fgetc(pfRead);
switch (first)
{
case '/':
{
second = fgetc(pfRead);
if (second == '/')
{
fputc(first, pfWrite);
fputc(second, pfWrite);
g_state = NULL_STATE;
}
else
{
fputc(first, pfWrite);
ungetc(second, pfRead);
}
break;
}
case '\n':
{
fputc(first, pfWrite);
g_state = NULL_STATE;
break;
}
case EOF:
{
g_state = END_STATE;
break;
}
default:
{
fputc(first, pfWrite);
break;
}
}
}
void DoConvert(char* ReadFile, char* WriteFile)
{
assert(ReadFile);
assert(WriteFile);
printf("转换开始\n");
//打开文件
FILE * pfRead = fopen(ReadFile,"r");
if (pfRead == NULL)
{
perror("open for read");
exit(EXIT_FAILURE);
}
FILE * pfWrite = fopen(WriteFile, "w");
if (pfWrite == NULL)
{
fclose(pfRead);
perror("open for write");
exit(EXIT_FAILURE);
}
//转换开始
while (g_state != END_STATE)
{
switch (g_state)
{
case NULL_STATE:
DoNullState(pfRead, pfWrite);
break;
case C_STATE:
DoCState(pfRead, pfWrite);
break;
case CPP_STATE:
DoCppState(pfRead, pfWrite);
break;
case END_STATE:
break;
}
}
//转换结束
fclose(pfRead);
fclose(pfWrite);
printf("转换结束\n");
}
void CommentConvert()
{
DoConvert(READ_FILE_NAME, WRITE_FILE_NAME);
}
#include"CommentConvert.h"
void test()
{
CommentConvert();
}
int main()
{
test();
system("pause");
}