注释转换 续
关于注释转换的问题 ,这里就不提了
。之前就已经
说明过是什么意思了
如果你你要是不知道 ,就点击这里 看看吧 注释转换
今天 要说的是将 C++注释转换为C语言注释 ,大家都知道 C++注释的风格 是 //.......注释一行 ,然后以\n作为
结束标志的,所以要将注释转换 ,
也同样要考虑多种
用问题
,
下面是我写的一些实例
/* 1.一般情况*/
// 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;
代码实现
~~~~~~~~~~头文件 .h~~~~~~~~~~~~
#pragma once
#include<stdio.h>
#include<stdlib.h>
enum STATE //定义一个枚举类型 表示 此时代码的状态
{
NUL,//无注释状态
C,//C语言注释状态
CPP,//C++注释状态
END//代码结束状态
};
//执行转换函数
void CommentConvert(FILE *pfin,FILE * pfout);//pfin 表示的是要读取的文件 ,pfout表示转换后输出的文件
//无状态转换
void DoNULConvert(FILE *pfin,FILE * pfout,enum STATE * state);
//c状态转换
void DoCConvert(FILE *pfin,FILE * pfout,enum STATE * state);
//c++状态转换
void DoCPPConvert(FILE *pfin,FILE * pfout,enum STATE * state);
~~~~~~~~~~~源文件.c~~~~~~~~~~~
#define _CRT_SECURE_NO_WARNINGS
#include "CommentConvert.h"
void CommentConvert(FILE *pfin,FILE * pfout)
{
enum STATE state = NUL;//初始化状态 为 无注释状态
while(state != END)//代码结束时跳出循环
{
switch(state)
{
case NUL://状态为无注释状态
{
DoNULConvert(pfin,pfout,&state);
}
break;
case C://状态为C注释状态
{
DoCConvert(pfin,pfout,&state);
}
break;
case CPP://状态为C++注释状态
{
DoCPPConvert(pfin,pfout,&state);
}
break;
default:
break;
}
}
}
//无状态转换
void DoNULConvert(FILE *pfin,FILE * pfout,enum STATE * state)
{
int start = 0;
int next = 0;
start = fgetc(pfin);//从文件中读取一个字符 来判断
switch( start)
{
case '/'://表示要进入注释状态
{
next = fgetc(pfin);//再从文件中读取一个字符 判断
switch(next)
{
case '*'://表示代码是 /* 表示进入C语言注释状态
{
fputc(start,pfout);//将注释输出到文件
fputc(next,pfout);
*state = C;//状态转换为 C注释状态
}
break;
case '/'://表示代码是 // 表示进入C++注释状态
{
fputc('/',pfout);//j将它改为C注释 输出到文件
fputc('*',pfout);
*state = CPP; //状态转换为 C++注释状态
}
break;
default: //表示这个'/ '是字符
{
fputc(start,pfout); //将读取到的字符输出到文件
ungetc(next,pfin);
}
break;
}
}
break;
case EOF://遇到EOF表示代码结束
{
fputc(start,pfout);//将EOF输到文件
*state = END;//状态改为 END
}
break;
default://表示遇到的不是注释 ,状态不变
{
fputc(start,pfout); //将读取的字符输出到文件
}
break ;
}
}
//c++状态转换
void DoCPPConvert(FILE *pfin,FILE * pfout,enum STATE * state)
{
int start = 0;
int next = 0;
int then = 0;
start = fgetc(pfin);//从文件中读取一个字符 来判断
switch(start)
{
case '\n' ://表示 C++一行注释结束
{
next = fgetc(pfin);
switch(next)//判断 下行 是不是也是注释
{
case '/':
{
then = fgetc(pfin);
if(then =='*')
{
fputc('*',pfout);
fputc('/',pfout);
fputc(start,pfout);
fputc(next,pfout);
fputc(then,pfout);
*state = C;
}
else if(then =='/')
{
fputc(start,pfout);
}
}
break;
case EOF:
fputc('*',pfout);
fputc('/',pfout);
fputc(start,pfout);
fputc(next,pfout);
*state = END;
break;
default:
fputc('*',pfout);
fputc('/',pfout);
fputc(start,pfout);
fputc(next,pfout);
*state = NUL;
break;
}
}
break;
case '*':
{
next = fgetc(pfin);
if(next == '/')
{;}
else
{
ungetc(next,pfin);
fputc(start,pfout);
}
}
break;
default:
fputc(start,pfout);
break;
}
}
//c状态转换
void DoCConvert(FILE *pfin,FILE * pfout,enum STATE * state)
{
int start = 0;
int next = 0;
int then = 0;
start = fgetc(pfin);//从文件中读取一个字符 来判断
switch(start)//c注释状态 不会直接转换为END状态
{
case '*'://遇到'*'表示C语言注释状态 可能会结束
{
next = fgetc(pfin); //再重新 读取 一个字符
switch(next)//判断
{
case '/'://表示 C语言注释 结束
{
fputc(start,pfout);
fputc(next,pfout);
*state = NUL;//状态装换为无注释状态
}
break;
default :
{
fputc(start,pfout);
ungetc(next,pfin);//将多余用来判断的字符撤销
}
break;
}
}
break;
default:
fputc(start,pfout); //否则直接输出
break;
}
}
~~~~~~~~~~~测试代码 .c~~~~~~~~~~~~
#define _CRT_SECURE_NO_WARNINGS
#include "CommentConvert.h"
int main()
{
FILE *pfin = NULL;//定义两文件指针
FILE *pfout= NULL;
pfin = fopen("input.c","r");//打开 读取 的文件
if(pfin == NULL )
{
perror("input file open:");//读取失败
exit(EXIT_FAILURE);
}
pfout = fopen("output.c","w");//打开 要写入 的文件
if(pfout ==NULL)
{
perror("output file open:");//读取失败
fclose(pfin);//要将读文件关闭取的
exit(EXIT_FAILURE);
}
CommentConvert(pfin,pfout);
printf("转换成功\n");
fclose(pfin);//关闭两文件
fclose(pfout);
system("pause");
return 0;
}<strong>
</strong>