#define _CRT_SECURE_NO_WARNINGS 1ide
#include"CommentConvert.h"函數
StateType state;3d
void DoNullState(FILE *read, FILE *write)blog
{get
int first = fgetc(read);input
int second = 0;it
switch (first)io
{class
case '/':file
second = fgetc(read);
if (second == '*')
{
fputc(first, write);
fputc('/', write);
state = C_STATE;
}
else if (second == '/')
{
fputc(first, write);
fputc(second, write);
state = CPP_STATE;
}
else
{
fputc(first, write);
fputc(second, write);
}
break;
case EOF:
fputc(first,write);
state = END_STATE;
default:
fputc(first, write);
break;
}
}
void DoCState(FILE *read, FILE *write)
{
int first = fgetc(read);
int second = 0;
switch (first)
{
case '*':
second = fgetc(read);
if (second == '/') //捨棄*/
{
int third = 0;
third = fgetc(read);
if (third != '\n'&&third != EOF)
{
fseek(read, -1, SEEK_CUR);
fputc('\n', write);
}
else
{
fputc('\n', write);
}
state = NULL_STATE;
}
else if (second == '*')
{
ungetc(second, read);
fputc(first, write);
}
else
{
fputc(first, write);
fputc(second, write);
}
break;
case '\n':
fputc(first, write);
fputc('/', write);
fputc('/', write);
break;
case EOF:
fputc(first,write);
state = END_STATE;
break;
default:
fputc(first, write);
break;
}
}
void DoCppState(FILE *read, FILE *write)
{
int first = fgetc(read);
int second = 0;
switch (first)
{
case '\n':
fputc(first, write);
state = NULL_STATE;
break;
case EOF:
state = END_STATE;
break;
default:
fputc(first, write);
break;
}
}
void ConvertWork(FILE *read, FILE *write)
{
state = NULL_STATE;
while (state != END_STATE)
{
switch (state)
{
case NULL_STATE:
DoNullState(read, write);
break;
case C_STATE:
DoCState(read, write);
break;
case CPP_STATE:
DoCppState(read, write);
break;
}
}
}
void CommentConvert()
{
FILE* pWrite = NULL;
FILE* pRead = fopen(INPUTFILENAME, "r");
if(pRead == NULL)
{
perror("open file for read");
exit(EXIT_FAILURE);
}
pWrite = fopen(OUTPUTFILENAME, "w");
if (pWrite == NULL)
{
fclose(pRead);
perror("open file for write");
exit(EXIT_FAILURE);
}
ConvertWork(pRead,pWrite); //轉換函數
fclose(pRead);
fclose(pWrite);
}
input.c
output.c
利用狀態機把此問題中涉及的分爲3個狀態,即C狀態,C++狀態,NULL狀態,當遍歷到某一個\n,/*,//時,要分狀況這三個狀態之間轉換