首先先来看看转换之前的文件注释:
经过分析,我们发现这些注释无非就是在下面四种情况之间进行转换,所以可以很容易编写出代码
接下来编写我们的代码
1.Commentconvert.h
#define _CRT_SECURE_NO_WARNINGS 1
#ifndef __COMMENT_CONVERT_H__
#define __COMMENT_CONVERT_H__
#include
#include
enum STATE
{
NUL_STATE,//正常状态
C_STATE, //C注释状态
CPP_STATE,//C++注释状态
END_STATE //文件结束
};
void DoCState(FILE *pfIn, FILE *pfOut, enum STATE *s);
void DoCppState(FILE *pfIn, FILE *pfOut, enum STATE *s);
void DoNulState(FILE *pfIn, FILE *pfOut, enum STATE *s);
void DoConvetWork(FILE *pfIn, FILE *pfOut);
#endif //__COMMENT_CONVERT_H__
2.Commentconvert.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "CommentConvert.h"
void DoConvetWork(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;
default:
break;
}
}
}
void DoNulState(FILE *pfIn, FILE *pfOut, enum STATE *s)
{
int first = 0;
int second = 0;
first = fgetc(pfIn);
switch (first)
{
case '/':
{
second = fgetc(pfIn);
if (second == '*')
{
fputc('/', pfOut);
fputc('/', pfOut);
*s = C_STATE;
}
else if (second == '/')
{
fputc(first, pfOut);
fputc(second, pfOut);
*s = CPP_STATE;
}
else
{
fputc(first, pfOut);
fputc(second, pfOut);
}
}
break;
case EOF:
{
*s = END_STATE;
}
break;
default:
fputc(first, pfOut);
break;
}
}
void DoCState(FILE *pfIn, FILE *pfOut, enum STATE *s)
{
int first = 0;
int second = 0;
int third = 0;
first = fgetc(pfIn);
switch (first)
{
case '\n':
{
fputc(first, pfOut);
fputc('/', pfOut);
fputc('/', pfOut);
}
break;
case '*':
{
second = fgetc(pfIn);
switch (second)
{
case '/':
{
*s = NUL_STATE;
third = fgetc(pfIn);
if (third == '\n')
{
fputc(third, pfOut);
}
else if (third == '/')
{
ungetc(third, pfIn);
fputc('\n', pfOut);
}
else
{
fputc('\n', pfOut);
fputc(third, pfOut);
}
}
break;
case '*':
{
fputc(second, pfOut);
ungetc('*', pfIn);
}
break;
default:
fputc(first, pfOut);
fputc(second, pfOut);
break;
}
}
break;
case EOF:
*s = END_STATE;
break;
default:
fputc(first, pfOut);
break;
}
}
void DoCppState(FILE *pfIn, FILE *pfOut, enum STATE *s)
{
int first = 0;
first = fgetc(pfIn);
switch (first)
{
case '\n':
{
fputc(first, pfOut);
*s = NUL_STATE;
}
break;
case EOF:
*s = END_STATE;
break;
default:
fputc(first, pfOut);
break;
}
}
3.test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "CommentConvert.h"
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)
{
perror("open file for write.");
fclose(pfIn);
exit(EXIT_FAILURE);
}
DoConvetWork(pfIn, pfOut);
fclose(pfIn);
fclose(pfOut);
}
int main()
{
test();
system("pause");
return 0;
}
这样我们的注释转换就完成了