注释转换:
题目描述:
给定一段代码,其中有c语言的注释风格,也有c++的注释风格,要求将c语言的注释风格转换为c++的注释风格,属于c++注释风格的不转换,剩余其他原样输出。
题目分析如下图:
需要的函数:首先我们需要3种状态和一个切换状态的函数,
1.空状态void Do_NUL_State(),即既不属于c状态也不属于c++状态;
2.c状态void Do_C_State(),需要将/*x*/,转换为//x;;
3.c++状态,即属于c++注释风格的不变
void Do_CPP_State();
4;切换函数void ConmentConvert(),用于切换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;
// 5.连续注释问题
/**//**/
// 6.连续的**/问题
/***/
// 7.C++注释问题
// /*xxxxxxxxxxxx*/
头文件部分:
#define _CRT_SECURE_NO_WARNINGS 1
#ifndef __CONMENTCONVERT_H
#define __CONMENTCONVERT_H
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define INPUTFILENAME "input.c"
#define OUTPUTFILENAME "output.c"
enum STATE
{
NUL_STATE,
C_STATE,
CPP_STATE,
END_STATE
};
void ConmentConvert(FILE *pfRead,FILE *pfWrite);
void Do_NUL_State(FILE *pfRead,FILE *pfWrite);
void Do_C_State(FILE *pfRead,FILE *pfWrite);
void Do_CPP_State(FILE *pfRead,FILE *pfWrite);
#endif
主函数部分:
<span style="color:#6600cc;">#include"ConmentConvert.h"
int main()
{
FILE *pfread=NULL;
FILE *pfwrite=NULL;
printf("转化开始\n");
pfread=fopen(INPUTFILENAME,"r");
if(NULL == pfread)
{
perror("open file for read\n");
exit(EXIT_FAILURE);
}
pfwrite=fopen(OUTPUTFILENAME,"w");
if(NULL == pfwrite)
{
fclose(pfread);
perror("open file for write\n");
exit(EXIT_FAILURE);
}
ConmentConvert(pfread,pfwrite);
printf("转化结束\n");
system("pause");
return 0;
} </span>
函数实现部分:
<pre name="code" class="cpp"><span style="font-size:18px;color:#ff0000;"><strong>#define _CRT_SECURE_NO_WARNINGS 1
#include"conmentconvert.h"
enum STATE state=NUL_STATE;
int frist=0;
int second=0;
int third=0;
void Do_NUL_State(FILE *pfRead,FILE *pfWrite)
{
frist=fgetc(pfRead);
switch(frist)
{
case '/':
second=fgetc(pfRead);
if(second=='*')
{
fputc('/',pfWrite);
fputc('/',pfWrite);
state=C_STATE;
}
else if(second=='/')
{
fputc(frist,pfWrite);
fputc(second,pfWrite);
state=CPP_STATE;
}
else//其他字符直接输出
{
fputc(frist,pfWrite);
fputc(second,pfWrite);
}
break;
case EOF://文件结束标志
state=END_STATE;
break;
default:
fputc(frist,pfWrite);//处理不是注释的字符
break;
}
}
void Do_C_State(FILE *pfRead,FILE *pfWrite)
{
frist=fgetc(pfRead);
switch(frist)
{
case '*':
second=fgetc(pfRead);
switch(second)
{
case '*': // 6.连续的/***/问题
third=fgetc(pfRead);
fputc(frist,pfWrite);
if(third == '/')
{
state=NUL_STATE;
}
break;
case '/':
third=fgetc(pfRead);
if(third == '/') //5.连续的注释问题/**//**/
{
ungetc('/',pfRead);
state=NUL_STATE;
break;
}
else
{
fputc(third,pfWrite); // /* int i = 0; */ \n int j = 0;
state=NUL_STATE;
break;
}
default: //不是注释的字符
fputc(frist,pfWrite);
fputc(second,pfWrite);
break;
}
break;
case '\n':
fputc('\n',pfWrite); //4.C注释中的多行注释
fputc('/',pfWrite);
fputc('/',pfWrite);
break;
case EOF:
state=END_STATE;
break;
default:
fputc(frist,pfWrite);
break;
}
}
void Do_CPP_State(FILE *pfRead,FILE *pfWrite)
{
frist=fgetc(pfRead);
switch(frist)
{
case '\n':
fputc(frist,pfWrite);
state=NUL_STATE;
break;
case EOF:
state=END_STATE;
break;
default:
fputc(frist,pfWrite);
break;
}
}
void ConmentConvert(FILE *pfRead,FILE *pfWrite)
{
while(state != END_STATE)
{
switch(state)
{
case NUL_STATE:
Do_NUL_State(pfRead,pfWrite);
break;
case C_STATE:
Do_C_State(pfRead,pfWrite);
break;
case CPP_STATE:
Do_CPP_State(pfRead,pfWrite);
break;
case END_STATE:
break;
default:
break;
}
}
}</strong></span>