主要知识点:有限状态机、文件读写
#ifndef _COMMENT_H__
#define _COMMENT_H__
#include <stdio.h>
#include<stdlib.h>
enum Status
{
NONE_STATUS,
C_STATUS,
CPP_STATUS,
END_STATUS
};
void doCppStatus(FILE* fpr, FILE* fpw, enum Status *status);
void doCStatus(FILE* fpr, FILE* fpw, enum Status *status);
void doNoneStatus(FILE* fpr, FILE* fpw, enum Status *status);
void doEndStatus(FILE* fpr, FILE* fpw, enum Status *status);
void commentConvert();
#endif
#define _CRT_SECURE_NO_WARNINGS
#include"comment.h"
void commentConvert()
{
FILE* fpread = NULL;
FILE* fpwrite = NULL;
int first = 0;
int second = 0;
enum Status status;
fpread = fopen("input.c", "r");
if (fpread ==NULL)
{
perror("open file error for read");
getchar();
exit(EXIT_FAILURE);
}
fpwrite = fopen("output.c", "w");
if (fpwrite==NULL)
{
fclose(fpread);
perror("opne file error for write");
getchar();
exit(EXIT_FAILURE);
}
first = fgetc(fpread);
if(first != EOF)
{
switch (first)
{
case '/':
second = fgetc(fpread);
switch (second)
{
case '/':
fputc(first, fpwrite);
fputc(second, fpwrite);
status = CPP_STATUS;
doCppStatus(fpread,fpwrite,&status);
break;
case '*':
fputc(first, fpwrite);
fputc(first, fpwrite);
status = C_STATUS;
doCStatus(fpread, fpwrite, &status);
break;
default:
fputc(first, fpwrite);
fputc(second, fpwrite);
doNoneStatus(fpread, fpwrite, &status);
break;
}
break;
default:
fputc(first, fpwrite);
doNoneStatus(fpread, fpwrite, &status);
break;
}
}
doEndStatus(fpread, fpwrite, &status);
}
convert.c
#define _CRT_SECURE_NO_WARNINGS
#include"comment.h"
void doCppStatus(FILE* fpr, FILE* fpw, enum Status *status)
{
int first = 0;
int second = 0;
first = fgetc(fpr);
while (first != EOF)
{
if (first == '\n')
{
fputc(first, fpw);
*status = NONE_STATUS;
doNoneStatus(fpr, fpw, status);
}
fputc(first, fpw);
first = fgetc(fpr);
}
if(first == EOF)
doEndStatus(fpr, fpw, status);
}
void doCStatus(FILE* fpr, FILE* fpw, enum Status *status)
{
int first = 0;
int second = 0;
int third = 0;
first = fgetc(fpr);
while(first != EOF)
{
switch (first)
{
case '*':
second = fgetc(fpr);
switch (second)
{
case '/':
*status = NONE_STATUS;
third = fgetc(fpr);
while ((third != '\n')||(third ==EOF))
{
if (third == ' ')
{
fputc(third, fpw);
}
else
{
fputc('\n', fpw);
break;
}
}
ungetc(third, fpr);
doNoneStatus(fpr, fpw, status);
break;
default:
fputc(first, fpw);
ungetc(second,fpr);
break;
}
break;
case '\n':
fputc(first, fpw);
fputc('/', fpw);
fputc('/', fpw);
break;
default:
fputc(first, fpw);
break;
}
first = fgetc(fpr);
}
}
void doNoneStatus(FILE* fpr, FILE* fpw, enum Status *status)
{
int first = 0;
int second = 0;
first = fgetc(fpr);
while (first != EOF)
{
switch (first)
{
case '/':
second = fgetc(fpr);
switch (second)
{
case'/':
fputc(first, fpw);
fputc(second, fpw);
*status = CPP_STATUS;
doCppStatus(fpr, fpw, status);
break;
case '*':
fputc(first, fpw);
fputc(first, fpw);
*status = C_STATUS;
doCStatus(fpr, fpw, status);
break;
case EOF:
fputc(first, fpw);
*status = END_STATUS;
doEndStatus(fpr, fpw, status);
break;
default:
fputc(first, fpw);
fputc(second, fpw);
break;
}
break;
default:
fputc(first, fpw);
break;
}
first = fgetc(fpr);
}
doEndStatus(fpr, fpw, status);
}
void doEndStatus(FILE* fpr, FILE* fpw, enum Status *status)
{
fclose(fpr);
fclose(fpw);
exit(EXIT_SUCCESS);
}
test.c
#define _CRT_SECURE_NO_WARNINGS
#include"comment.h"
void test()
{
commentConvert();
}
int main()
{
test();
system("pause");
return 0;
}