本函数就是见得实现一下C注释、CPP注释和普通模式之间的转换
(这只是在下的粗浅理解,不足的地方还请谅解,欢迎留言提出,后期理解深入后会加以改进)
1、先来了解一下这四种模式之间转换的条件
2、接下来就是完成的主要步骤了
我是将主函数与实现函数分不同的文件建立的
(1)、分别建立 mian.c convert_comment.c convert_comment.h三个新建项
在mian.c 中是主函数只需要调用在convert_comment.c 的函数就OK了
在convert_comment.h中就是函数的声明了
在convert_comment.c中就是函数的定义了
这也是最主要的代码部分
(2)、接下来将详细的介绍代码部分
也就是三个函数的实现
普通模式
void do_null_status(FILE *ifp, FILE *ofp) //普通模式
{
int c = fgetc(ifp);
if (c == '/') //是 '/'时,进入判断
{
int s = fgetc(ifp);
if (s == '*') //下一发是'*'时
{
fputc('/', ofp);
fputc('/', ofp); //将'/*'转换为'//'
status = CSTATUS; //转换至C注释函数
}
else if (s == '/') //下一个是'/'时
{
fputc('/', ofp);
fputc('/', ofp);
status = CPPSTATUS; //转换至CPP注释函数
}
else
{
fputc(c, ofp);
ungetc(c, ifp);
}
}
else if (c == EOF) //为EOF时,文件结束
status = EOFSTATUS;
else
fputc(c, ofp);
}
C注释
void do_c_status(FILE *ifp, FILE *ofp) //C注释
{
int c = fgetc(ifp);
if (c == '*') //为'*'时进入判断
{
int s = fgetc(ifp);
if (s == '/') //为'/'时,说明C注释结束
{
fputc('\n', ofp);
status = NULLSTATUS; //转入普通模式
}
else
{
fputc(c, ofp);
ungetc(c, ifp);
status = CSTATUS;
}
}
else if (c == EOF)
status = EOFSTATUS;
else if (c == '\n') //因为C注释是多行注释,所以遇到'\n’时,还是C注释,
{ //需要给下一行添加'//'
fputc(c, ofp);
fputc('/', ofp);
fputc('/', ofp);
status = CSTATUS;
}
else
{
fputc(c, ofp);
status = CSTATUS;
}
}
CPP注释
void do_cpp_status(FILE *ifp, FILE *ofp) //CPP注释
{
int c = fgetc(ifp);
if (c == '\n') //若为'\n'则CPP注释结束
{
fputc(c, ofp);
status = NULLSTATUS; //转为普通模式
}
else if (c == EOF) //为EOF则文件结束
{
fputc(c, ofp);
status = EOFSTATUS;
}
else
{
fputc(c, ofp);
status = CPPSTATUS;
}
}
以上就是我的理解
下面是整体代码
mian.c
#include<stdio.h>
#include"convert_comment.h"
int main()
{
convert_main();
return 0;
}
convert_comment.h
#ifndef __CONVERT_COMMENT_H__
#define __CONVERT_COMMENT_H__
#define INPUTFILE "input.c"
#define OUTPUTFILE "output.c"
enum
{
NULLSTATUS, // 普通模式
CSTATUS, // C模式
CPPSTATUS, //CPP模式
EOFSTATUS, //EOF模式
};
void convert_main();
void do_null_status(FILE *ifp, FILE *ofp); //普通模式函数声明
void do_c_status(FILE *ifp, FILE *ofp); //C注释函数声明
void do_cpp_status(FILE *ifp, FILE *ofp); //CPP注释函数声明
#endif
convert_comment.c
#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);
if (c == '/')
{
int s = fgetc(ifp);
if (s == '*')
{
fputc('/', ofp);
fputc('/', ofp);
status = CSTATUS;
}
else if (s == '/')
{
fputc('/', ofp);
fputc('/', ofp);
status = CPPSTATUS;
}
else
{
fputc(c, ofp);
ungetc(c, ifp);
}
}
else if (c == EOF)
status = EOFSTATUS;
else
fputc(c, ofp);
}
void do_c_status(FILE *ifp, FILE *ofp) //C注释
{
int c = fgetc(ifp);
if (c == '*')
{
int s = fgetc(ifp);
if (s == '/')
{
fputc('\n', ofp);
status = NULLSTATUS;
}
else
{
fputc(c, ofp);
ungetc(c, ifp);
status = CSTATUS;
}
}
else if (c == EOF)
status = EOFSTATUS;
else if (c == '\n')
{
fputc(c, ofp);
fputc('/', ofp);
fputc('/', ofp);
status = CSTATUS;
}
else
{
fputc(c, ofp);
status = CSTATUS;
}
}
void do_cpp_status(FILE *ifp, FILE *ofp) //CPP注释
{
int c = fgetc(ifp);
if (c == '\n')
{
fputc(c, ofp);
status = NULLSTATUS;
}
else if (c == EOF)
{
fputc(c, ofp);
status = EOFSTATUS;
}
else
{
fputc(c, ofp);
status = CPPSTATUS;
}
}
void convert_work(FILE *ifp, FILE *ofp)
{
while (status != EOFSTATUS)
{
switch (status)
{
case NULLSTATUS:
do_null_status(ifp, ofp);
break;
case CSTATUS:
do_c_status(ifp, ofp);
break;
case CPPSTATUS:
do_cpp_status(ifp, ofp);
break;
case EOFSTATUS:
break;
default:
break;
}
}
}
void convert_main()
{
FILE *ifp = fopen(INPUTFILE, "r");
FILE *ofp = fopen(OUTPUTFILE, "w");
if (ifp == NULL || ofp == NULL)
{
printf("This is no have!");
return;
}
convert_work(ifp, ofp);
fclose(ifp);
fclose(ofp);
}
运行结果图