利⽤C语⾔⽂件IO来实现C、C++源代码中注释内容的转换:C注释转换为C++⻛格的注释。
实现原理剖析:
具体代码如下:
convert_comment.h
#ifndef __CONVERT_COMMENT_H__
#define __CONVERT_COMMENT_H__
#include <stdio.h>
#include <windows.h>
#define INPUTFILE "input.c"
#define OUTPUTFILE "output.c"
enum { NULLSTATUS, CSTATUS, CPPSTATUS, EOFSTATUS };
#endif // __CONVERT_COMMENT_H__
convert_comment.c
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include "convert_comment.h"
int status = NULLSTATUS;
void do_null_status(FILE *ifp, FILE *ofp)//普通状态
{
int c = fgetc(ifp);
switch (c)
{
case '/':
{
int s = fgetc(ifp);
switch (s)
{
case '*':
fputc('/', ofp);
fputc('/', ofp);
status = CSTATUS;
break;
case '/':
fputc('/', ofp);
fputc('/', ofp);
status = CPPSTATUS;
break;
case EOF:
status = EOFSTATUS;
break;
default:
fputc(c, ofp);
ungetc(s, ifp);
status = NULLSTATUS;
break;
}
}
break;
case EOF:
status = EOFSTATUS;
break;
default:
fputc(c, ofp);
status = NULLSTATUS;
break;
}
}
void do_cpp_status(FILE *ifp, FILE *ofp)
{
int c = fgetc(ifp);
switch (c)
{
case '\n':
fputc(c, ofp);
status = NULLSTATUS;
break;
case EOF:
status = EOFSTATUS;
break;
default:
fputc(c, ofp);
status =CPPSTATUS;
break;
}
}
void do_c_status(FILE *ifp, FILE *ofp)
{
int c = fgetc(ifp);
switch (c)
{
case '*':
{
int s = fgetc(ifp);
switch (s)
{
case '/':
fputc('\n', ofp);
status = NULLSTATUS;
break;
case EOF:
status = EOFSTATUS;
break;
default:
fputc(c, ofp);
ungetc(s, ifp);
status = CSTATUS;
break;
}
}
break;
case '\n':
fputc(c, ofp);
fputc('/', ofp);
fputc('/', ofp);
status = CSTATUS;
break;
case EOF:
status = EOFSTATUS;
break;
default:
fputc(c, ofp);
status = CSTATUS;
break;
}
}
static void convert_work(FILE *ifp, FILE *ofp)
{
while (status != EOFSTATUS)
{
switch (status)
{
case NULLSTATUS:
do_null_status(ifp, ofp);
break;
case CPPSTATUS:
do_cpp_status(ifp, ofp);
break;
case CSTATUS:
do_c_status(ifp, ofp);
break;
case EOFSTATUS:
break;
default:
break;
}
}
}
void connver_main()
{
FILE *ifp = fopen(INPUTFILE, "r");
FILE *ofp = fopen(OUTPUTFILE, "w");
if (ifp == NULL || ofp == NULL)
{
fprintf(stderr,"this is fopen erro\n");
}
convert_work(ifp, ofp);
fclose(ifp);
fclose(ofp);
}
main.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "convert_comment.h"
int main()
{
connver_main();
system("pause");
return 0;
}
测试用例如下:
input.c
// 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.连续注释问题
/*int a = 0;*//*int b = 0;*/
// 6.连续的**/问题
/***/
// 7.C++注释问题
// /*xxxxxxxxxxxx*/
相应的output.c
// 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.连续注释问题
//int a = 0;
//int b = 0;
// 6.连续的**/问题
//*
// 7.C++注释问题
// /*xxxxxxxxxxxx*/