状态分析图:
CommentConvert.h
#ifndef __COMMENT_CONVERT_H__
#define __COMMENT_CONVERT_H__
#define _CRT_SECURE_NO_WARNINGS
#include <xpu.h>
#include <Windows.h>
enum State{
NUL_STATE, //无注释状态
C_STATE, //C注释状态
CPP_STATE,//C++注释状态
END_STATE, //结束状态
};
//注释转换的函数
void CommentConver(FILE *pfIn,FILE *pfOut);
//无状态的处理函数
void DoNulState(FILE *pfIn,FILE *pfOut,enum State *ps);
//C注释的处理函数
void DoCState(FILE *pfIn,FILE *pfOut,enum State *ps);
//C++ 状态的处理函数
void DoCppState(FILE *pfIn,FILE *pfOut,enum State *ps);
#endif //__COMMENT_CONVERT_H__
CommentConvert.c
#include "CommentConvert.h"
void DoNulState(FILE *pfIn,FILE *pfOut,enum State *ps)
{
int first = fgetc(pfIn);
switch(first)
{
case '/':
{
int second = fgetc(pfIn);
switch(second)
{
case '*':
{
putc('/',pfOut);
putc('/',pfOut);
*ps = C_STATE;
}
break;
case '/':
{
fputc(first,pfOut);
fputc(second,pfOut);
*ps = CPP_STATE;
}
break;
default:
{
fputc(first,pfOut);
fputc(second,pfOut);
}
break;
}
}
break;
case EOF: //到了文件结束
{
fputc(first,pfOut);
*ps = END_STATE;
break;
}
default:
fputc(first,pfOut);
break;
}
}
void DoCState(FILE *pfIn,FILE *pfOut,enum State *ps)
{
int first = fgetc(pfIn);
switch(first)
{
case '*':
{
int second = fgetc(pfIn);
switch(second)
{
case '/':
{
int third = fgetc(pfIn);
if(third == '\n')
{
fputc(third,pfOut);
}
else //不是换行的需要手动加换行
{
fputc('\n',pfOut);
ungetc(third,pfIn);//把将来做判断的字符送回流中
}
*ps = NUL_STATE;
}
break;
default:
{
putc(first,pfOut);
ungetc(second,pfIn);
}
break;
}
}
break;
case '\n':
{
fputc(first,pfOut);
fputc('/',pfOut);
fputc('/',pfOut);
}
break;
default:
fputc(first,pfOut);
break;
}
}
void DoCppState(FILE *pfIn,FILE *pfOut,enum State *ps)
{
int first = fgetc(pfIn);
switch(first)
{
case '\n':
{
fputc(first,pfOut);
*ps = NUL_STATE;
}
break;
case EOF:
*ps = END_STATE;
break;
default:
fputc(first,pfOut);
break;
}
}
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;
}
}
}
Github上的地址,请多多指教: