实现注释行的转化
//convert.h 头文件
#ifndef __CONVERT_H__
#define __CONVERT_H__
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#define INPUT "input.c"//定义宏代替访问的文件
#define OUTPUT "output.c"
//声明一个枚举类型,标识文档状态
enum STA{
NULLSTAT,
CSTAT,
CPPSTAT,
EOFSTAT
};
void Convert_main(FILE * input, FILE * output);
#endif
//convert.c 实现转化文件
#define _CRT_SECURE_NO_WARNINGS 1
#include"convert.h"
enum STA status = NULLSTAT;
void Do_nullstata(FILE * input, FILE * output)//普通情况处理
{
int f = fgetc(input);
switch (f)
{
case '/':
{int s = fgetc(input);
switch (s)
{
case '/':
fputc('/', output);
fputc('/', output);
status = CPPSTAT;//若遇到//,转为C++状态注释处理
break;
case '*':
fputc('/', output);
fputc('/', output);
status = CSTAT;//若遇到/*,转为C状态注释处理
break;
default:
fputc(f, output);//其它情况的话,输出这个字符
ungetc(s, input);//注意:此处的第二个字符应该退回,
//因为不确定它与下一个字符结合会是什么情况
}
}
break;
case EOF:status = EOFSTAT;//若遇得到文件结尾,转为文件结束状态处理
break;
default://若是正常字符,输出即可
fputc(f, output);
status = NULLSTAT;//保留现在的状态
break;
}
}
void Do_cstata(FILE * input, FILE * output)//C注释状态处理
{
int f = fgetc(input);
switch (f)
{
case '\n':
fputc(f, output);//遇到换行符则换行,并在下一行注释前面加//
fputc('/', output);
fputc('/', output);
status = CSTAT;
break;
case '*':
{
int s = fgetc(input);
switch (s)
{
case '/':
{
int t = fgetc(input);
if (t != '\n')
{
fputc('\n', output);
ungetc(t, input);
//若是遇到*/则注释结束,若注释后面有内容,则退回读取,设为普通状态
//例如 *//int q = 9527;
}
status = NULLSTAT;
break;
}
default:
fputc(f, output);
ungetc(s, input);//若只是一个*号,后面不是/,则输出*,第二个字符退回读取,状态不变
//例如 /* int j = 10,2*3=6; */
break;
}
}
break;
case EOF:
status = EOFSTAT;
break;
default:
fputc(f, output);
status = CSTAT;
break;
}
}
void Do_cppstata(FILE * input, FILE * output)//C++注释状态处理
{
int f = fgetc(input);
switch (f)
{
case '\n':
fputc(f, output);//遇到换行符,则输出,并将其转换为普通状态
status = NULLSTAT;
break;
case EOF:
status = EOFSTAT;
break;
default :
fputc(f, output);//若是普通字符则输出,继续保留C++注释状态
status = CPPSTAT;
break;
}
}
void Do_eofstata(FILE * input, FILE * output)//文件结束处理
{
int f = fgetc(input);
fputc(f, output);
}
void Convert_main(FILE * input, FILE * output)
{
while (status != EOFSTAT)//循环访问,若每次没有遇到EOF,则继续访问
{
switch (status)
{
case NULLSTAT:
Do_nullstata(input, output);
break;
case CSTAT:
Do_cstata(input, output);
break;
case CPPSTAT:
Do_cppstata(input, output);
break;
case EOFSTAT:
Do_eofstata(input, output);
break;
default:break;
}
}
}
//main.c 主函数文件
#define _CRT_SECURE_NO_WARNINGS 1
#include "convert.h"
int main()
{
FILE * finp=fopen(INPUT, "r");
FILE * foutp = fopen(OUTPUT, "w");
if (finp == NULL || foutp == NULL)
{
sprintf(stderr, "open file");
exit(1);
}
else
{
Convert_main(finp, foutp);
}
fclose(finp);
fclose(foutp);
fflush(stdin);
getchar();
return 0;
}
//input.c 测试用例文件
//我是测试用例
// this is cpp \ncomment
/* int i = 0; */
/* int j = 10,2*3=6; */int k = 3;
/*555*/
int n = 20;
n / 2 = 10;
/*
int i = 0;
int j = 20;
int k = 250;
*//int q = 9527;
/***/
/* int z = 7748258; *//*int b=94250;*/
// /*dsklfjdasl;fdsf;ldsfds*/
//output.c 转化输出文件
//我是测试用例
// this is cpp \ncomment
// int i = 0;
// int j = 10,2*3=6;
int k = 3;
//555int n = 20;
n / 2 = 10;
//
//int i = 0;
//int j = 20;
//int k = 250;
//
/int q = 9527;
//*
// int z = 7748258;
//int b=94250;
// /*dsklfjdasl;fdsf;ldsfds*/