这里所说的注释转换是指将C风格的注释转换成C++风格的注释。那么我们如何来实现这个目的呢?
首先我们得有一个名为 input.c 的文件 ,里面写着一段C风格的注释和一些代码。而我们转换后的注释及代码应该保存在一个名为 output.c 的文件里。要将 input.c中的内容转换,我们就得将该文件中的内容一个一个取出,一边取一边转换,这里我们需要用到 fgetc()和fputc()这两个库函数。那么我们该如何转换呢,我们就得画出转换图:
画出状态转换图后,我们就可以开始进行代码的编写了。
首先创建一个main.c 文件
代码如下:
#include<stdio.h>
#include"comment.h"
int main()
{
convert_main();
return 0;
}
接下来创建一个名为comment.h的头文件
#ifndef __COMMENT_H__
#define __COMMENT_H__
#define INPUTFILE "input.c"//输入文件
#define OUTPUTFILE "output.c"//转换后的输出文件
enum
{
CSTATUS,
CPPSTATUS,
NULLSTATUS,
EOFSTAUS
};
void convert_main();
#endif
最后再创建一个convert.c 文件,主要实现convert_main()函数
#include<stdio.h>
#include<stdlib.h>
#include"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(c, ofp);
fputc(s, ofp);
status = CPPSTATUS;
break;
case EOF:
status = EOFSTAUS;
break;
default:
fputc(c, ofp);
ungetc(s, ifp);
status = NULLSTATUS;
break;
}
}
break;
case EOF:
status = EOFSTAUS;
break;
default:
fputc(c, ofp);
status = NULLSTATUS;
break;
}
}
//在C注释模式下
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;
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 = NULLSTATUS;
break;
default:
fputc(c, ofp);
break;
}
}
//在C++注释下
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 = NULLSTATUS;
break;
default:
fputc(c, ofp);
break;
}
}
static void convert_work(FILE *ifp, FILE * ofp)
{
while (status != EOFSTAUS)
{
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 EOFSTAUS:
break;
default:
break;
}
}
}
void convert_main()
{
FILE * ifp = fopen(INPUTFILE, "r");
FILE * ofp = fopen(OUTPUTFILE, "w");
if (ifp == NULL&&ofp == NULL)
{
fprintf(stdout,"open error");
return;
}
convert_work(ifp, ofp);
fclose(ifp);
fclose(ofp);
}
最后运行结果:
以上就是,注释转换这个小项目的实现,如有更好的方法,请在评论区中交流。