今天学习了用编程来实现将C语言注释转换成C++注释
CommentConvert.h
#ifndef _COMMENT_COVERT_H
#define _COMMENT_COVERT_H
#define INPUTFILENAME "input.c"
#define OUTPUTFILENAME "output.c"
#include<stdio.h>
#include<stdlib.h>
enum STATE
{
NUL_STATE,
C_STATE,
CPP_STATE,
END_STATE
};
void DoConverentWork(FILE* pfIn,FILE* pfOut);
void DoNulState(FILE* pfIn,FILE* pfOut);
void DoCState(FILE* pfIn,FILE* pfOut);
void DoCPPState(FILE* pfIn,FILE* pfOut);
#endif
CommentConvert.c
#include"CommentConvert.h"
enum STATE state=NUL_STATE;
void DoConverentWork(FILE* pfIn,FILE* pfOut)
{
while(state!=END_STATE)
{
switch(state)
{
case NUL_STATE:
DoNulState(pfIn,pfOut);
break;
case C_STATE:
DoCState(pfIn,pfOut);
break;
case CPP_STATE:
DoCPPState(pfIn,pfOut);
break;
case END_STATE:
break;
default:
break;
}
}
}
void DoNulState(FILE* pfIn,FILE* pfOut)
{
int first=0;
int second=0;
first=fgetc(pfIn);
switch(first)
{
case '/':
second=fgetc(pfIn);
switch(second)
{
case'*': //C注释转换为C++注释
fputc('/',pfOut);
state=C_STATE;
break;
case'/': //C++注释直接输出并进入C++模式
fputc(first,pfOut);
state=CPP_STATE;
break;
default: //其他字符直接输出
fputc(first,pfOut);
break;
}
case EOF: //文件结束标志
fputc(first,pfOut);
break;
default: //不是注释的字符
fputc(first,pfOut);
break;
}
}
void DoCState(FILE* pfIn,FILE* pfOut)
{
int first =0;
int second =0;
int third =0;
first=fgetc(pfIn);
switch(first)
{
case '*': //6.连续的/***/
{
second=fgetc(pfIn);
switch(second)
{
case '/':
third=fgetc(pfIn);
if(third!='\n')
fputc('\n',pfOut);
fputc(third,pfOut);//4.多行注释问题
if(third=='/') //5.连续的注释问题/**//**/
ungetc('/',pfIn);
state=NUL_STATE;
break;
case '*':
third=fgetc(pfIn);
fputc(first,pfOut);
if(third=='/')
{
state=NUL_STATE;
}
break;
default: //不是注释问题
fputc(first,pfOut);
fputc(second,pfOut);
break;
}
}
break;
case '\n': //4、C注释中的多行注释
fputc('\n',pfOut);
fputc('/',pfOut);
fputc('/',pfOut);
break;
case EOF: //文件结束标志
state=END_STATE;
break;
default: //不是注释的字符
fputc(first,pfOut);
break;
}
}
void DoCPPState(FILE* pfIn,FILE* pfOut)
{
int first=0;
first=fgetc(pfIn);
switch(first)
{
case '\n':
fputc(first,pfOut);
state=NUL_STATE;
break;
case EOF:
state=END_STATE;
break;
default:
fputc(first,pfOut);
break;
}
}
#include"CommentConvert.h"
int main()
{
FILE* pfIn=NULL;
FILE* pfOut=NULL;
printf("转换开始\n");
pfIn=fopen(INPUTFILENAME,"r");
if(NULL==pfIn)
{
perror("open file for read\n");
exit(EXIT_FAILURE);
}
pfOut=fopen(OUTPUTFILENAME,"w");
if(NULL==pfOut)
{
fclose(pfOut);
perror("open file for write\n");
exit(EXIT_FAILURE);
}
DoConverentWork(pfIn,pfOut);
printf("转换结束\n");
}
新建一个input.c的文件查看结果