这篇文章将实现 c语言注释转换为c++注释
例如,将下面的c语言注释转换为c++注释
// 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;
// 5.连续注释问题
/**//**/
// 6.连续的**/问题
/***/
// 7.C++注释问题
// /*xxxxxxxxxxxx*/
#自定义头文件部分
#ifndef __COMMENTCONVERT_H__
#define __COMMENTCONVERT_H__
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#define INPUT "input.c"
#define OUTPUT "output.c"
enum KIND//枚举表示操作选项
{
END_START,
NULL_START,
C_START,
Cpp_START,
};
void CommentConvert(FILE *pfin, FILE *pfout);//注释转换操作函数
void DoNullState(FILE *pfin, FILE *pfout,enum KIND *sta);//普通字符转换函数
void DoCState(FILE *pfin, FILE *pfout,enum KIND *sta);//c语言注释转换为c++注释函数
void DoCppState(FILE *pfin, FILE *pfout,enum KIND *sta);//c++注释转换函数
#endif
#函数功能实现部分
#define _CRT_SECURE_NO_WARNINGS 1
#include"CommentConvert.h"
void DoNullState(FILE *pfin, FILE *pfout,enum KIND *sta)//普通字符转换函数
{
int first = 0;
int second = 0;
first = fgetc(pfin);//从input.c文件中读取一个字符
switch(first)
{
case '/':
{
fputc(first,pfout);//将第一个字符输出到output.c文件中
second = fgetc(pfin);//读取下一个字符
switch(second)
{
case '*'://如果是“/*”就将‘*’改为‘/’放入output.c中
fputc('/',pfout);
*sta = C_START;//进入c语言注释转换函数中
break;
case '/'://如果是“//”,将second输出到output.c文件中
fputc(second,pfout);
*sta = Cpp_START;//进入c++注释转换函数中
break;
default:
fputc(second,pfout);
break;
}
}
break;
case EOF://读到文件结尾
fputc(first,pfout);
*sta = END_START;
break;
default://其他字符
fputc(first,pfout);
break;
}
}
void DoCState(FILE *pfin, FILE *pfout,enum KIND *sta)//c语言注释转换为c++注释函数
{
int first = 0;
int second = 0;
first = fgetc(pfin);
switch(first)
{
case '/':
fputc(first,pfout);
break;
case '*':
{
second = fgetc(pfin);
switch(second)
{
case '*':
fputc(first,pfout);
ungetc(second,pfin);//将*之后的内容放到缓存区
break;
case '/':
{
int third = fgetc(pfin);//判断第三个字符是不是“\n”解决这种注释问题:/* int i = 0; */int j = 0;
*sta = NULL_START;
if(third=='\n')
fputc('\n',pfout);
else
{
fputc('\n',pfout);
ungetc(third,pfin);
}
}
break;
default:
fputc(first,pfout);
fputc(second,pfout);
break;
}
}
break;
case '\n':
second = fgetc(pfin);
switch(second)
{
case '*':
{
int third = fgetc(pfin);
if(third == '/')
{
fputc('\n',pfout);
*sta = NULL_START;
}
else
{
fputc('/',pfout);
fputc('/',pfout);
fputc(second,pfout);
fputc(third,pfout);
}
break;
}
default:
fputc('\n',pfout);
fputc('/',pfout);
fputc('/',pfout);
ungetc(second,pfin);
break;
}
break;
default:
fputc(first,pfout);
break;
}
}
void DoCppState(FILE *pfin, FILE *pfout,enum KIND *sta)//c++注释转换函数
{
int first = 0;
first = fgetc(pfin);
switch(first)
{
case '\n':
fputc(first,pfout);
*sta = NULL_START;
break;
default:
fputc(first,pfout);
break;
}
}
void CommentConvert(FILE *pfin, FILE *pfout)//注释转换操作函数
{
int input = 0;
int output = 0;
enum KIND sta = NULL_START;
while(sta!=END_START)
{
switch(sta)
{
case NULL_START:
DoNullState(pfin, pfout, &sta);//普通字符转换函数
break;
case C_START:
DoCState(pfin, pfout, &sta);//c语言注释转换为c++注释函数
break;
case Cpp_START:
DoCppState(pfin, pfout, &sta);//c++注释转换函数
break;
case END_START:
break;
default:
break;
}
}
printf("转换成功!\n");
fclose(pfin);
fclose(pfout);
}
#主函数部分
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include"CommentConvert.h"
int main()
{
FILE *pfout = NULL;
FILE *pfin = NULL;
pfin = fopen(INPUT,"r");//打开文件
if(pfin == NULL)
{
perror("not open file");
exit(EXIT_FAILURE);
}
pfout=fopen(OUTPUT,"w");//写入文件
if(pfout == NULL)
{
perror("not open file");
fclose(pfin);
exit(EXIT_FAILURE);
}
CommentConvert(pfin,pfout);//注释转换操作函数
system("pause");
return 0;
}
#结果
output.c
// 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;
// 5.连续注释问题
//
//
// 6.连续的**/问题
//*
// 7.C++注释问题
// /*xxxxxxxxxxxx*/