#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
enum State
{
END_STATE,
NUL_STATE,
C_STATE,
CPP_STATE,
};
void DoNulcomment(FILE *pfIn, FILE *pfOut, State*s)
{
int first = 0;
first = fgetc(pfIn);
switch (first)
{
case'/':
{
int second = 0;
second = fgetc(pfIn);
switch (second)
{
case'/'://cpp״̬
{
fputc(first, pfOut);
fputc(second, pfOut);
*s = CPP_STATE;
}
break;
case'*'://c״̬
{
fputc(first, pfOut);
fputc('/', pfOut);
*s = C_STATE;
}
break;
default:
fputc(first, pfOut);
fputc(second, pfOut);
break;
}
}
break;
case EOF:
fputc(first, pfOut);
*s = END_STATE;
break;
default:
fputc(first, pfOut);
break;
}
}
void DoCcomment(FILE *pfIn, FILE *pfOut, State*s)
{
int first = 0;
first = fgetc(pfIn);
switch (first)
{
case '*':
{
int second = 0;
second = fgetc(pfIn);
switch (second)
{
case'/':
{
int third = fgetc(pfIn);
if (third == '\n')
{
fputc(third, pfOut);
*s = NUL_STATE;
}
else
{
fputc('\n', pfOut);
ungetc(third, pfIn);
*s = NUL_STATE;
}
break;
}
case'*':
ungetc('*', pfIn);
fputc(first, pfOut);
break;
default:
fputc(first, pfOut);
fputc(second, pfOut);
break;
}
}
break;
case'/':
{
int second = 0;
second = fgetc(pfIn);
switch (second)
{
case'/':
{
fputc(first, pfOut);
fputc(second, pfOut);
*s = CPP_STATE;
}
break;
default:
fputc(first, pfOut);
fputc(second, pfOut);
break;
}
}
break;
case '\n':
{
int third = fgetc(pfIn);
fputc(first, pfOut);
if (third == '*')
{
ungetc('*', pfIn);
}
else
{
fputc('/', pfOut);
fputc('/', pfOut);
}
break;
}
default:
fputc(first, pfOut);
break;
}
}
void DoCppcomment(FILE *pfIn, FILE *pfOut, State*s)
{
int first = 0;
first = fgetc(pfIn);
switch (first)
{
case'/':
{
int second = 0;
second = fgetc(pfIn);
switch (second)
{
case'/':
fputc(first, pfOut);
fputc(second, pfOut);
*s = CPP_STATE;
break;
default:
fputc(first, pfOut);
fputc(second, pfOut);
break;
}
}
break;
case'*':
{
int second = 0;
second = fgetc(pfIn);
switch (second)
{
case'/':
{
fputc(first, pfOut);
fputc(second, pfOut);
*s = NUL_STATE;
break;
}
case'*':
{
ungetc('*', pfIn);
fputc(first, pfOut);
break;
}
default:
fputc(first, pfOut);
fputc(second, pfOut);
break;
}
}
break;
case '\n':
*s = NUL_STATE;
fputc(first, pfOut);
break;
case EOF:
*s = END_STATE;
break;
default:
fputc(first, pfOut);
break;
}
}
int main()
{
//创建文件
FILE *pfOut = NULL;
FILE *pfIn = NULL;
pfIn = fopen("input.c", "r");
if (pfIn == NULL)
{
perror("pfin::fopen");
exit(EXIT_FAILURE);
}
pfOut = fopen("output.c", "w");
if (pfOut == NULL)
{
perror("pfout::fopen");
fclose(pfIn);
exit(EXIT_FAILURE);
}
//开始进行读取和转换
enum State state = NUL_STATE;
while (state != END_STATE)
{
switch (state)
{
case NUL_STATE:
DoNulcomment(pfIn, pfOut, &state);
break;
case C_STATE:
DoCcomment(pfIn, pfOut, &state);
break;
case CPP_STATE:
DoCppcomment(pfIn, pfOut, &state);
break;
}
}
//关闭文件
fclose(pfIn);
fclose(pfOut);
system("pause");
return 0;
}
下面的是input.c文件
// 1.一般情况
int num = 0;
/* 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;
*/int k = 0;
// 5.连续注释问题
/*a*//*b*/
// 6.连续的**/问题
/***/
// 7.C++注释问题
// /*xxxxxxxxxxxx*/
下面是output.c文件
// 1.一般情况
int num = 0;
// int i = 0;
// 2.换行问题
// int i = 0;
int j = 0;
// int i = 0;
int j = 0;
// 3.匹配问题
//int i = 0;/*xxxxx
// 4.多行注释问题
//
//nt i=0;
//nt j = 0;
//nt k = 0;
int k = 0;
// 5.连续注释问题
//a
//b
// 6.连续的**/问题
//*
// 7.C++注释问题
// /*xxxxxxxxxxxx*/