注释转换:将C语言中的注释风格/*...*/转换为C++的注释风格//.
转换方法先分析如下图:
由图可以看出,将注释转换过程分为四种状态,NULL_STATE(无注释状态)、C_STATE(C语言注释状态)、CPP_STATE(C++注释状态)、END_STATE(文件结束状态),通过四种状态的相互切换实现注释的转换,具体实现过程为:用文件的方式中函数fopen打开源文件input.c,并进行读操作,打开output.c文件,进行注释转换后的写操作,转换过程中调用函数CommentConvert(pfIn,pfOut)转换,先在NULL_STATE状态下用函数fgetc函数读取第一个字符,若为'/',再读取第二个字符,若为'*'则切换到C_STATE状态实现,若第二个字符为'/',则切换到CPP_STATE状态实现,如此一直相互切换,并在各自状态具体代码实现下用fputc函数输出转换为C++注释和各个原字符,直至遇到EOF,状态切换为end_state.
而在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*/
根据这些情况,在此项目中我们则将这作为input.c文件对其进行转换,具体代码实现过程如下:
分别定义三个文件:
头文件CommentConvert.h
#ifndef __CommentConvert_H__
#define __CommentConvert_H__
#include
#include
enum STATE
{
NUL_STATE,
C_STATE,
CPP_STATE,
END_STATE,
};
void CommentConvert(FILE *pfIn,FILE *pfOut);
void Do_NUL_STATE(FILE *pfIn,FILE *pfOut,enum STATE *state);
void Do_C_STATE(FILE *pfIn,FILE *pfOut,enum STATE *state);
void Do_CPP_STATE(FILE *pfIn,FILE *pfOut,enum STATE *state);
#endif __CommentConvert_H__
#include "CommentConvert.h"
void CommentConvert(FILE *pfIn,FILE *pfOut)
{
void DoConverWork(FILE *pfIn,FILE *pfOut);
DoConverWork(pfIn,pfOut);
}
void DoConverWork(FILE *pfIn,FILE *pfOut)
{
enum STATE state=NUL_STATE;
while(state!=END_STATE)
{
switch(state)
{
case NUL_STATE:
Do_NUL_STATE(pfIn,pfOut,&state);
break;
case C_STATE:
Do_C_STATE(pfIn,pfOut,&state);
break;
case CPP_STATE:
Do_CPP_STATE(pfIn,pfOut,&state);
break;
default:
break;
}
}
}
void Do_NUL_STATE(FILE *pfIn,FILE *pfOut,enum STATE *state)
{
int first=0;
int second=0;
first=fgetc(pfIn);
switch(first)
{
case '/':
{
second=fgetc(pfIn);
switch(second)
{
case '*':
{
fputc('/',pfOut);
fputc('/',pfOut);
*state=C_STATE;
}
break;
case '/':
{
fputc(first,pfOut);
fputc(second,pfOut);
*state=CPP_STATE;
}
break;
default:
{
fputc(first,pfOut);
fputc(second,pfOut);
}
break;
}
}
break;
case EOF:
*state=END_STATE;
break;
default:
fputc(first,pfOut);
break;
}
}
void Do_C_STATE(FILE *pfIn,FILE *pfOut,enum STATE *state)
{
int first=0;
int second=0;
int third=0;
first=fgetc(pfIn);
switch(first)
{
case '*':
{
second=fgetc(pfIn);
switch(second)
{
case '/':
{
third=fgetc(pfIn);
if(third!='\n')
{
fputc('\n',pfOut);
}
if(third=='/')
{
ungetc(third,pfIn);
*state=NUL_STATE;
break;
}
fputc(third,pfOut);
*state=NUL_STATE;
}
break;
case '*':
{
fputc(first,pfOut);
third=fgetc(pfIn);
if(third=='/')
{
*state=NUL_STATE;
break;
}
fputc(second,pfOut);
ungetc(third,pfIn);
}
break;
default:
{
fputc(first,pfOut);
fputc(second,pfOut);
}
break;
}
}
break;
case '\n':
{
fputc(first,pfOut);
fputc('/',pfOut);
fputc('/',pfOut);
}
break;
case EOF:
*state=END_STATE;
break;
default:
fputc(first,pfOut);
break;
}
}
void Do_CPP_STATE(FILE *pfIn,FILE *pfOut,enum STATE *state)
{
int first=0;
first=fgetc(pfIn);
switch(first)
{
case '\n':
{
fputc(first,pfOut);
*state=NUL_STATE;
}
break;
case EOF:
*state=END_STATE;
break;
default:
fputc(first,pfOut);
break;
}
}
#include "CommentConvert.h"
int main()
{
FILE *pfIn=NULL;
FILE *pfOut=NULL;
pfIn=fopen("input.c","r");
if(pfIn==NULL)
{
perror("error input.c");
exit(EXIT_FAILURE);
}
pfOut=fopen("output.c","w");
if(pfOut==NULL)
{
perror("error output.c");
fclose(pfIn);
exit(EXIT_FAILURE);
}
CommentConvert(pfIn,pfOut);
printf("****转换成功****\n");
fclose(pfIn);
fclose(pfOut);
system("pause");
return 0;
}
// 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*/