对于注释转换首先给出我的测试图:
由图可以看出将左边的c语言注释转换为右边c++注释就是注释转换
首先说明一下转换思想方法:
1.创建两个文件input.c和output.c,input.c里面用来读取c语言的注释,output.c里面保存转换成为c++的注释,中间的转换过程就是代码完成,当然文件名字和作用自己规定
2.转换的实际过程就是从存放c语言注释的文件中读取数据这里是一个字符一个字符读取,然后通过相关的函数将其转换为c++注释后的代码再写入保存c++注释的文件中
当然这里会用fgetc和fputc函数,其实这个项目就是练习文件的读写能力
在这里封装了三个函数:
1.void donulstate(FILE *pfin, FILE *pfout, enum STATE *s);//非C++,C状态的函数声明
这个是不存在注释的代码语句处理函数,即刚开始进入文件读写的函数
2.void docstate(FILE *pfin, FILE *pfout, enum STATE *s);//c状态进行操作
这个是发现是c语言注释的语句,则用这个函数将其改造为c++注释
3.void docppstate(FILE *pfin, FILE *pfout, enum STATE *s);//c++状态进行操作
这个是发现是c语言注释的语句,则用这个函数将其改造读写到保存c++注释额文件中
其核心的思想部分是这个样子,我用图来解释:
接下来给出具体的代码
首先给出commentconver.h头文件
#define _CRT_SECURE_NO_WARNINGS 1
#ifndef __COMMENT_CONVER_H__
#define __COMMENT_CONVER_H__
#include<stdio.h>
#include<stdlib.h>
enum STATE
{
END_STATE,//结束
NUL_STATE,//无状态
C_STATE,//c注释函数
CPP_STATE,//c++状态
};
void donulstate(FILE *pfin, FILE *pfout, enum STATE *s);//非C++,C,结束状态的函数声明
void docstate(FILE *pfin, FILE *pfout, enum STATE *s);//c状态进行操作
void docppstate(FILE *pfin, FILE *pfout, enum STATE *s);//c++状态进行操作
#endif
接下来给出commentconver.c具体状态函数的实现代码
#define _CRT_SECURE_NO_WARNINGS 1
#include"CommentConver.h"
void donulstate(FILE *pfin, FILE *pfout, enum STATE *s)//开始无状态
{
int first =0;
first = fgetc(pfin);
switch (first)
{
case '/'://第一个读取到'/'
{
int sceond = fgetc(pfin);
switch (sceond)
{
case '/'://第二个也读取‘/’,c++注释
{
*s = CPP_STATE;//状态转化到c++状态里面去
fputc(first, pfout);
fputc(sceond, pfout);
}
break;
case '*'://第二个读取到*为c的注释
{
*s = C_STATE;//状态转换到c状态里面去
fputc('/', pfout);
fputc('/', pfout);
}
break;
default:// 其他非注释情况直接读取
{
fputc(first, pfout);
fputc(sceond, pfout);
}
break;
}
}
break;
case EOF://直接文件读取结束
{
*s = END_STATE;
}
break;
default://刚开始未发现注释相关符号
{
fputc(first, pfout);
}
break;
}
}
void docstate(FILE *pfin, FILE *pfout, enum STATE *s)//C注释状态
{
int first = 0;
first = fgetc(pfin);
switch (first)
{
case '*'://结尾读取到*
{
int sceond = 0;
sceond = fgetc(pfin);
switch (sceond)
{
case '/'://一般情况:/* int i = 0; */
{
*s = NUL_STATE;//不需要操作
}
break;
case '*'://连续注释问题如:/***/
{
fputc(first, pfout);
ungetc(sceond, pfin);
}
break;
default://其它非注释情况
{
fputc(first, pfout);
fputc(sceond, pfout);
}
}
}
break;
case '\n'://多行注释问题
{
fputc(first, pfout);
fputc('/', pfout);
fputc('/', pfout);
}
break;
default://结尾直接是其他非注释情况
{
fputc(first, pfout);
}
break;
}
}
void docppstate(FILE *pfin, FILE *pfout, enum STATE *s)//c++注释状态
{
int first = 0;
first = fgetc(pfin);
switch (first)
{
case '\n'://一般情况
{
fputc(first, pfout);
*s = NUL_STATE;
}
break;
case EOF://文件读取结束
{
*s = END_STATE;
}
break;
default://其他非注释情况
fputc(first, pfout);
break;
}
}
最后给出test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"CommentConver.h"
void commentconver(FILE *pfin, FILE *pfout)
{
enum state state = NUL_STATE;//开始赋值为无状态
while (state != END_STATE)//等于文件读取结束状态的话文件读取结束
{
switch (state)//状态的切换选择
{
case NUL_STATE:
donulstate(pfin,pfout,&state);
break;
case C_STATE:
docstate(pfin, pfout, &state);
break;
case CPP_STATE:
docppstate(pfin, pfout, &state);
break;
}
}
}
void test()
{
FILE *pfin = fopen("input.c", "r");//从文件里面读取东西
if (pfin == NULL)
{
perror("use open file read");
exit(EXIT_FAILURE);
}
FILE *pfout = fopen("output.c", "w");//往文件里面写东西
if (pfout == NULL)
{
perror("use open file write");
exit(EXIT_FAILURE);
}
//
commentconver(pfin, pfout);//调用转换函数
fclose(pfin);
fclose(pfout);
}
int main()
{
test();
system("pause");
return 0;
}
由于开头给出的图片就是我的测试结果所以这里就不放测试结果了
欢迎大家留言一起交流学习!