主功能函数:
#include<stdio.h>
#include"convert.h" //引自己定义的头文件
int status = NULSTAT; //定义全局变量,用于显示当前状态
void do_nul(FILE *ifp,FILE *ofp)//正常无注释情况下的工作
{
char c = fgetc(ifp); //从文件中读取一个字符
switch (c) //判断字符c
{
case '/': //若字符为‘/’,再判断下一个字符
{ char s = fgetc(ifp);
switch (s)
{
case '/':
fputc('/', ofp);
fputc('/', ofp);
status = CPPSTAT; //c为/,s为/,进入c++注释
break;
case '*':
fputc('/', ofp);
fputc('/', ofp);
status = CSTAT; //c为/,s为*,进入c注释
break;
default:
fputc('/', ifp); //s为普通字符,输出‘/’
break;
}}
break;
case '\n': //字符c为换行符,输出换行符在目标文件,状态变为无
//注释状态
fputc(c, ofp);
status = NULSTAT;
break;
case EOF: //字符c为文件结束标志,则执行文件结束状态的工作
status = EOFSTAT;
break;
default:
fputc(c, ofp); //字符c为正常字符,则正常输出,状态变为
//无注释状态
status =NULSTAT;
break;
}
}
void do_c(FILE *ifp, FILE *ofp) //c注释状态的工作
{ //此工作状态下已有“/*”
char c = fgetc(ifp); //判断后续字符
switch (c)
{
case '*': //若碰见字符‘*’,判断是否注释结束
{char s = fgetc(ifp);
switch (s)
{
case '/':
fputc('\n', ofp); // 此时有“*/”
status = NULSTAT; //状态变为无注释状态
break;
default: //否则输出字符*,将字符s退回到ifp;将状态变为c状态
fputc(c, ofp);
ungetc(s, ifp);
status =CSTAT;
break;
}
}
break;
case '\n'://若字符c为换行符,输出换行符,再输出c++注释符“//”
fputc('\n', ofp);
fputc('/', ofp);
fputc('/', ofp);
status = CSTAT;//状态为C注释
break;
case EOF:
status = EOFSTAT;
break;
default:
fputc(c, ofp);
status = CSTAT;
break;
}
}
void do_cpp(FILE *ifp, FILE *ofp) //c++注释状态下的工作
{
char c = fgetc(ifp);
switch (c)
{
case '\n':
fputc(c, ofp);
status = NULSTAT;
break;
case EOF:
status = EOFSTAT;
break;
default:
fputc(c, ofp);
status = CPPSTAT;
break;
}
}
void convert(FILE *ifp, FILE *ofp) //主函数
{
while (status != EOFSTAT) //判断状态,选择执行什么
//状态下的工作
{
switch (status)
{
case NULSTAT:
do_nul(ifp, ofp);
break;
case CSTAT:
do_c(ifp, ofp);
break;
case CPPSTAT:
do_cpp(ifp, ofp);
break;
case EOF:
break;
default:
break;
}
}
}
自定义头文件
#ifndef CONVERT_H
#define CONVERT_H
void convert(FILE *ifp, FILE *ofp);
enum{NULSTAT,CSTAT,CPPSTAT,EOFSTAT};
#define INPUT “input.txt”
#define OUTPUT “output.txt”
#endif
#include<stdio.h>
#include<stdlib.h>
#include"convert.h"
int main()
{
FILE *ifp = fopen(INPUT, "r");
FILE *ofp = fopen(OUTPUT, "w");
if (ifp == NULL || ofp == NULL)
{
fprintf(stderr,"open file error");
exit(1);
}
convert(ifp, ofp);
fclose(ifp);
fclose(ofp);
system("pause");
return 0;
}
测试用例:
// 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++ 注释问题
:
/ /*xxxxx
输出结果
// 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*/