- 列表内容
功能思想:
1)注释分为两种:c 语言注释和 c++ 注释
2)文本状态分为四种:
普通状态(即NULLSTATUS)
C++状态(即CPPSTATUS)
C 状态(即CSTATUS)
EOF状态(即EOFSTATUS)
3)四种状态关系图
具体实现:
普通状态 —– C 状态(或C++ 状态)
/* int i = 0; */
// 1.一般情况
进入普通状态,读取字符,当读到 ‘/ ’ 时,进行判断下一个字符,如果是 ‘ * ’ (或 ‘ / ’),则表示这是C 状态的注释(或C++状态),进入到C状态(或C++ 状态)再进行判断C 状态(或C ++ 状态) —— 普通状态
由状态图可知,进入C状态(或C++状态)后,回到普通状态由标志 ‘ * / ’(或 ‘ \ n ’)决定,当遇到标志后方可回到普通状态。但需要注意的是:C状态下的结束标志为 ‘ */ ’
普通状态(C/C++ 状态)——EOF状态
EOF即文件的结束标志,故当普通状态(C/C++ 状态)遇到EOF时,就进入EOF状态
多行注释问题
/*
int i=0;
int j = 0;
int k = 0;
*/int k = 0;
分析:遇到‘ /* ’进入C状态,进行注释转换,但每行存在换行;当遇到换行符时,需输出换行符,换行到下一行,并且输出 ‘ // ’ 来保证注释正确
代码实现:
convert.h
#ifndef __CONVERT_H__
#define __CONVERT_H__
#include<stdio.h>
#include<stdlib.h>
enum
{
NULLSTATUS,
CPPSTATUS,
CSTATUS,
EOFSTATUS
};
void convert_test();
void convert_work(FILE *ifp, FILE *ofp);
#endif // !__CONVERT_H__
convert.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"convert.h"
int status = NULLSTATUS;
//普通状态
void do_nullstatus(FILE *ifp, FILE *ofp)
{
int c = fgetc(ifp);
switch (c)
{
case '/':
{
int s = fgetc(ifp);
switch (s)
{
case '/':
fputc('/', ofp);
fputc('/', ofp);
status = CPPSTATUS;
break;
case '*':
fputc('/', ofp);
fputc('/', ofp);
status = CSTATUS;
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;
}
}
//c++ 状态
void do_cppstatus(FILE *ifp, FILE *ofp)
{
int c = fgetc(ifp);
if (c == '\n')
{
fputc(c, ofp);
status = NULLSTATUS;
}
else if (c == EOF)
{
status = EOFSTATUS;
}
else
{
fputc(c, ofp);
status = CPPSTATUS;
}
}
//c状态
void do_cstatus(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('\n', ofp);
fputc('/', ofp);
fputc('/', ofp);
status = CSTATUS;
break;
case EOF:
status = EOFSTATUS;
break;
default:
fputc(c, ofp);
status = CSTATUS;
break;
}
}
void convert_work(FILE *ifp,FILE *ofp)
{
while (status != EOFSTATUS)
{
switch (status)
{
case NULLSTATUS:
do_nullstatus(ifp, ofp);
break;
case CPPSTATUS:
do_cppstatus(ifp, ofp);
break;
case CSTATUS:
do_cstatus(ifp, ofp);
break;
case EOFSTATUS:
break;
default:
break;
}
}
}
void convert_test()
{
FILE *ifp;
FILE *ofp;
ifp = fopen("input.c", "r");
ofp = fopen("output.c", "w");
if (ifp == NULL || ofp == NULL)
{
perror("Error open");
exit(EXIT_FAILURE);
}
convert_work(ifp, ofp);
fclose(ifp);
fclose(ofp);
}
test.c
#include<stdio.h>
#include"convert.h"
int main()
{
convert_test();
return 0;
}
测试结果: