这次主要讲的是把C语言的注释(/* ···· */)转换为c++的注释(//)
根据下面的图来分析情况
位置情况遇到/*时转到C语言注释的情况,遇到//时转到c++注释的情况,遇到EOF时转换为结束状态。C语言状态遇到*/转到未知状态。c++状态遇到\n时转到未知状态,遇到EOF时转到结束状态。
转换时要注意以下几个问题:
// 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*/
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
#ifndef _COMMENT_CONVERT_T_
#define _COMMENT_CONVERT_T_
#include<stdio.h>
#include<stdlib.h>
#include<io.h>
#include<string.h>
enum State
{
NUL_STATE,
C_STATE,
CPP_STATE,
END_STATE
};
void DoCommentConvent(FILE*pfIn, FILE *pfout);
void DoNulState(FILE*pfIn, FILE*pfout, enum State*state);
void DoCState(FILE*pfIn, FILE*pfout, enum State*state);
void DoCppState(FILE*pfIn, FILE*pfout, enum State*state);
#endif //_COMMENT_CONVERT_T_
CommenConvert.c
#include"CommentConvert.h"
void DoCppState(FILE*pfIn, FILE*pfout, enum State*state)//c++注释的情况
{
int first = fgetc(pfIn);
switch(first)
{
case'\n': //遇到‘\n’代表这行结束,状态转换为未知状态
fputc(first,pfout);
*state = NUL_STATE;
break;
case EOF: //遇到EOF时,转换为结束状态
*state = END_STATE;
break;
default:
fputc(first,pfout);
break;
}
}
void DoCState(FILE*pfIn, FILE*pfout, enum State*state)//c注释的情况
{
int first = fgetc(pfIn);
switch(first)
{
case '*':
{
int seccod = fgetc(pfIn);
switch(seccod)
{
case '/': 遇到*/时C语言注释结束,转换为未知状态
{
int ret = fgetc(pfIn);
*state = NUL_STATE;
if(ret == '\n') //判断*/后面有没有其他东西,有的话换行输出
{
fputc(ret, pfout);
}
else
{
fputc ('\n', pfout);
ungetc(ret, pfIn);
}
}
break;
case '*': //*后面是*的情况,把第一个*输出,把第二个*返回去用来下次判断
{
fputc(first, pfout);
ungetc(seccod,pfIn);
}
break;
default:
{
fputc(first, pfout);
fputc(seccod, pfout);
}
break;
}
}
break;
case'\n': //遇到‘\n’时,换行的同时,在下一行加‘//’
{
fputc('\n', pfout);
fputc('/', pfout);
fputc('/', pfout);
}
break;
default:
fputc(first, pfout);
break;
}
}
void DoNulState(FILE*pfIn, FILE*pfout, enum State*state)//未知情况
{
int first = fgetc(pfIn);
switch(first)
{
case '/':
{
int seccod = fgetc(pfIn);
switch(seccod)
{
case '/': //遇到‘//’时转换为c++状态
{
fputc(first, pfout);
fputc(seccod, pfout);
*state = CPP_STATE;
}
break;
case '*': //遇到‘/*’时转换为c状态
{
fputc(first, pfout);
fputc(first, pfout);
*state = C_STATE;
}
break;
case EOF: //遇到EOF时,转换为结束状态
*state = END_STATE;
break;
default : //其它情况原样输出
fputc(first, pfout);
fputc(seccod, pfout);
}
}
break;
case EOF:
*state = END_STATE;
break;
default :
fputc(first, pfout);
break;
}
}
void DoCommentConvent(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: //C语言状态时
DoCState(pfIn, pfout, &state);
break;
case CPP_STATE: //C++状态时
DoCppState(pfIn, pfout, &state);
break;
default :
break;
}
}
printf("转换成功\n");
}
text.c
#include"CommentConvert.h"
void test1 ()//可以对一个文件夹下是所有 .c 文件进行注释转换,然后将多个.c 文件再写入另一个文件夹下去
{
FILE *fpin = NULL;
FILE *fpout = NULL;
char ch = 0;
struct _finddata_t cfile;
char path[50] = "D:\\bite\\";
char path1[50] = "D:\\bite\\";
char path_out[50] = "D:\\out\\";
long a;
if ((a = _findfirst (strcat (path, "*.c"), &cfile)) == -1L)
{
printf ("路径错误!!!\n");
system ("pause");
return ;
}
do
{
strcpy (path1, "D:\\bite\\");
strcpy (path_out, "D:\\out\\");
if( (cfile.attrib == _A_ARCH||_A_HIDDEN||_A_RDONLY||_A_SUBDIR||_A_SYSTEM) && ~strcmp(cfile.name,".")&& ~strcmp(cfile.name,".."))
{
printf("%s :",cfile.name);
strcat (path1,cfile.name);
strcat (path_out,cfile.name);
//printf ("path = %s\n", path);
//printf ("path1 = %s\n", path1);
//printf ("path_out = %s\n", path_out);
fpin = fopen (path1, "r");//打开 fpin 文件
if (fpin == NULL)
{
printf ("打开文件错误!!!\n");
system ("pause");
return ;
}
fpout = fopen (path_out, "w");//打开fpout 文件
if (fpout == NULL)
{
printf ("打开文件错误!!!\n");
fclose (fpin);
system ("pause");
return ;
}
DoCommentConvent (fpin, fpout);
printf ("转换之后的路径为:%s\n\n", path_out);
fclose (fpout);
fclose (fpin);
}
}while(_findnext(a,&cfile) == 0); /* 成功找到时返回0*/
printf("\n");
_findclose(a);
}
void Text()
{
FILE*pfout = NULL;
FILE*pfIn = fopen("input.c","r");
if(pfIn == NULL)
{
printf("打开失败\n");
exit(1);
}
pfout = fopen("output.c", "w");
if(pfout == NULL)
{
printf("打开失败\n");
exit(1);
}
DoCommentConvent(pfIn, pfout);
fclose(pfIn);
pfIn = NULL;
fclose(pfout);
pfout = NULL;
}
int main()
{
test1 ();
//Text();
system("pause");
return 0;
}