·CommentConvert.c
#include "CommentConvert.h"
void DoNulState(FILE*pfIn, FILE*pfOut, enum State* ps)
{
int first=fgetc(pfIn);
int second=0;
switch(first)
{
case '/':
{
second=fgetc(pfIn);
switch(second)
{
case '/':
{
fputc(first,pfOut);
fputc(second,pfOut);
*ps=CPP_STATE;
break;
}
case '*':
{
fputc('/',pfOut);
fputc('/',pfOut);
*ps=C_STATE;
break;
}
default :
{
fputc(first,pfOut);
fputc(second,pfOut);
break;
}
}
break;
}
case EOF:
{
*ps=END_STATE;
}
default:
{
fputc(first,pfOut);
break;
}
}
}
void DoCState(FILE*pfIn, FILE*pfOut, enum State* ps)
{
int first=fgetc(pfIn);
int second=0;
int third=0;
switch(first)
{
case '*':
{
second = fgetc(pfIn);
switch(second)
{
case '/':
{
third =fgetc(pfIn);
if(third == '\n')
{
fputc(third,pfOut);
}
else
{
fputc('\n',pfOut);
ungetc(third,pfIn);
}
*ps = NUL_STATE;
}
break;
default :
{
fputc(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 = 0;
int second = 0;
int third= 0;
first = fgetc(pfIn);
switch(first)
{
case '\n' :
{
fputc(first,pfOut);
*ps = NUL_STATE;
}
break;
default :
fputc(first,pfOut);
break;
}
}
·test.c
#include "CommentConvert.h"
void DoCommentConvert(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;
}
}
}
void test()
{
FILE *pfIn=NULL;
FILE *pfOut=NULL;
pfIn=fopen("input.c","r");
if(pfIn==NULL)
{
perror("open file for read");
exit(EXIT_FAILURE);
}
pfOut=fopen("output.c","w");
if(pfOut==NULL)
{
fclose(pfIn);
perror("open file for write");
exit(EXIT_FAILURE);
}
DoCommentConvert(pfIn,pfOut);
fclose(pfIn);
fclose(pfOut);
}
int main()
{
test();
printf("转换成功\n");
return 0;
}