C语言与c++有着不同的注释方式,所以我进行了将c的注释转换成c++的注释
CommentConvert.h文件
#define _CRT_SECURE_NO_WARNINGS 1
#ifndef __COMMENT_H__
#define __COMMENT_H__
#include <stdio.h>
#include <stdlib.h>
enum STATE
{
NUL_STATE,
C_STATE,
CPP_STATE,
END_STATE
};
void DoCState(FILE* pfIn, FILE* pfOut);
void DoCppState(FILE* pfIn, FILE* pfOut);
void DoNulState(FILE* pfIn, FILE* pfOut);
void DoConvertWork(FILE* pfIn, FILE* pfOut);
#endif //__COMMENT_H__
CommentConvert.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include "CommentConvert.h"
static enum STATE state = NUL_STATE;
void DoConvertWork(FILE* pfIn, FILE* pfOut)
{
while (state != END_STATE)
{
switch (state)
{
case NUL_STATE:
DoNulState(pfIn, pfOut);
break;
case C_STATE:
DoCState(pfIn, pfOut);
break;
case CPP_STATE:
DoCppState(pfIn, pfOut);
break;
default:
break;
}
}
}
void CommentConvert()
{
FILE* pfWrite = NULL;
FILE* pfRead = NULL;
pfRead = fopen("input.c", "r");
if (pfRead == NULL)
{
perror("open file for read");
return;
}
pfWrite = fopen("output.c", "w");
if (pfWrite == NULL)
{
perror("open file for write");
fclose(pfRead);
return;
}
DoConvertWork(pfRead, pfWrite);
fclose(pfRead);
fclose(pfWrite);
}
void DoNulState(FILE* pfIn, FILE* pfOut)
{
int first = fgetc(pfIn);
switch (first)
{
case '/':
{
int second = fgetc(pfIn);
switch (second)
{
case '*':
fputc(first, pfOut);
fputc('/', pfOut);
state = C_STATE;
break;
case'/':
fputc(first, pfOut);
fputc('/', pfOut);
state = CPP_STATE;
break;
case EOF:
fputc(first, pfOut);
state = END_STATE;
break;
default:
fputc(first, pfOut);
fputc(second, pfOut);
}
}
break;
case EOF:
fputc(first, pfOut);
state = END_STATE;
break;
default:
fputc(first, pfOut);
break;
}
}
void DoCState(FILE* pfIn, FILE* pfOut)
{
int first = fgetc(pfIn);
int second = 0;
switch (first)
{
case '*':
second = fgetc(pfIn);
if (second == '/')
{
int third = fgetc(pfIn);
state = NUL_STATE;
if (third != '\n')
{
fputc('\n', pfOut);
ungetc(third, pfIn);
}
if (third == '\n')
{
fputc(third, pfOut);
}
}
else
{
fputc(first, pfOut);
ungetc(second, pfIn);
}
break;
case '\n':
fputc(first, pfOut);
fputc('/', pfOut);
fputc('/', pfOut);
break;
case EOF:
fputc(first, pfOut);
state = END_STATE;
break;
default:
fputc(first, pfOut);
break;
}
}
void DoCppState(FILE* pfIn, FILE* pfOut)
{
int first = fgetc(pfIn);
switch (first)
{
case'\n':
fputc(first, pfOut);
state = NUL_STATE;
break;
case EOF:
fputc(first, pfOut);
state = END_STATE;
break;
default:
fputc(first, pfOut);
break;
}
}
test.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include "CommentConvert.h"
void test()
{
CommentConvert();
}
int main()
{
test();
system("pause");
return 0;
}
结果对比如下:
