一个小的注释转换项目
我们要将c语言的注释(/**/)全部转换成c++(//)样子的!!
画张图我们就了解了整个流程
convert.h
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#ifndef __CONVERT_H__
#define __CONVERT_H__
enum{EOFSTAT,CPPSTAT,NULSTAT,CSTAT};//定义了一个枚举常量
#endif
main.c
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"convert.h"
int main()
{
convert_main();//调用convert_main函数
system("pause");
return 0;
}
convert.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"convert.h"
#define INPUT "input.c"
#define OUPUT "output.c"
static int status = NULSTAT;
/*只要读到的字符不确定是什么,就将字符直接退回文件用ungetc函数*/
void do_cpp_stat(FILE *ipf, FILE *opf)// //进入c++状态
{
int c = fgetc(ipf);
switch (c)
{
case '\n'://如果后面读到一个\n,则依旧是无注释状态
{
fputc('\n',opf);//输出一个换行
status = NULSTAT;
}break;
case EOF:
status = EOFSTAT;
break;
default:
fputc(c, opf);//如果为其他的则依旧为c++状态
status = CPPSTAT;
break;
}
}
void do_null_stat(FILE *ipf, FILE *opf)//当为无注释状态时
{
int c = fgetc(ipf);//读取的第一个字符
switch (c)
{
case'/'://如果是'/'
{
int s = fgetc(ipf);//读取的下一个字符
switch (s)
{
case '/'://下一个字符如果是'/'则进入c++状态
{
fputc(c, opf);
fputc(s, opf);
status = CPPSTAT;
}break;
case'*'://如果是*则进入c语言状态
{
fputc(c, opf);
fputc('/', opf);
status = CSTAT;
}break;
case EOF://如果是EOF则结束转换
status = EOFSTAT;
break;
default://如果都不是则为除号则依旧在无注释状态
fputc(c, opf);
ungetc(s, ipf);
status = NULSTAT;
break;
}
}break;
case EOF:
status = EOFSTAT;
break;
default:
fputc(c, opf);
status = NULSTAT;
break;
}
}
void do_c_stat(FILE *ipf, FILE *opf)// 读取到一个/*进入到该状态
{
int c = fgetc(ipf);//继续读取字符
switch (c)
{
case'\n'://当读取到\n时
{
fputc('\n', opf);//输出\n换行后继续输出//
fputc('/', opf);
fputc('/', opf);
}break;
case'*':
{
int s = fgetc(ipf);//读取的下一个字符
switch (s)
{
case'/'://此时应为注释结束状态,再读取一个字符判断后面还有没有语句如有语句输出‘\n'
//转换到无注释状态,若后面直接是'\n'直接输出
{
int n = fgetc(ipf);
if (n != '\n')
{
ungetc(n, ipf);
fputc('\n', opf);
status = NULSTAT;
}
else
{
fgetc('\n', opf);
status = NULSTAT;
}
} break;
case EOF:
status = EOFSTAT;
break;
default://若为其他则依旧为c语言状态
fputc(c, opf);
ungetc(s, ipf);
status = CSTAT;
break;
}
}break;
case EOF:
status = EOFSTAT;
break;
default:
fputc(c, opf);
status = CSTAT;
break;
}
}
void do_eof_work(FILE *ipf, FILE *opf)
{
int f = fgetc(ipf);
fputc(f, opf);
}
static void convert_work(FILE *ipf, FILE *opf)
{
while (status!=EOFSTAT)//status为一个全局变量为当前程序的状态:四种状态分别为无注释状态,c语言/* 状态,c++状态 //,文件结尾状态
{
switch (status)
{
case CSTAT://c语言状态
do_c_stat(ipf,opf);
break;
case NULSTAT://无注释状态
do_null_stat(ipf, opf);
break;
case CPPSTAT://c++状态
do_cpp_stat(ipf, opf);
break;
case EOFSTAT:
//do_eof_work(ipf, opf);
break;
default:
break;
}
}
}
void convert_main()
{
FILE *ipf = fopen(INPUT, "r");//以只读方式打开
FILE *opf = fopen(OUPUT, "w");//以只写方式打开
if (ipf == NULL || opf == NULL)
{
printf("open file fail!!",stderr);//如果有一个文件指针为NULL则打开文件失败
exit(1);
}
else
{
convert_work(ipf, opf);//调用convert_work函数
}
fclose(ipf);
fclose(opf);
}
互相交流互相学习!!要是有什么错误希望可以及时指出^-^!!!万分感谢!!!