我们要测试几种情况,将一些.c文件里的C语言注释转换成c++语言注释。
commentconvert.h
#ifndef __COMMENTCONVERT_H__
#define __COMMENTCONVERT_H__
#include<stdio.h>
#include<stdlib.h>
enum State
{
NUL_STATE,//无注释状态
C_STATE,//C注释状态
CPP_STATE,//C++注释状态
END_STATE //结束状态
};
void DoNulState(FILE *pfIn, FILE *pfOut, enum State *state);
void DoCState(FILE *pfIn, FILE *pfOut, enum State *state);
void DoCppState(FILE *pfIn, FILE *pfOut, enum State *state);
void commentconvert(FILE* pfIn, FILE* pfOut);
#endif //__COMMENTCONVERT_H__
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"commentconvert.h"
void test()
{
FILE* pfIn;
FILE* pfOut;
pfIn = fopen("Input.c", "r");
if (pfIn == NULL)
{
perror("the file for read");
exit(EXIT_FAILURE);
}
pfOut = fopen("Output.c", "w");
if (pfOut == NULL)
{
perror("the file for read");
fclose(pfIn);
pfIn = NULL;
exit(EXIT_FAILURE);
}
commentconvert(pfIn, pfOut);
fclose(pfOut);
pfOut = NULL;
}
int main()
{
test();
system("pause");
return 0;
}
commentconvert.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"commentconvert.h"
void DoNulState(FILE *pfIn, FILE *pfOut, enum State *state)
{
int first = fgetc(pfIn);
switch (first)
{
case '/':
{
int second = fgetc(pfIn);
switch (second)
{
case '*':
{
fputc('/', pfOut);
fputc('/', pfOut);
*state = C_STATE;
}
break;
case '/':
{
fputc(first, pfOut);
fputc(second, pfOut);
*state = CPP_STATE;
}
break;
case EOF:
{
fputc(first, pfOut);
*state = END_STATE;
}
break;
default:
{
fputc(first, pfOut);
fputc(second, pfOut);
}
break;
}
}
break;
case EOF:
*state = END_STATE;
break;
default:
fputc(first, pfOut);
break;
}
}
void DoCState(FILE *pfIn, FILE *pfOut, enum State *state)
{
int first = fgetc(pfIn);
switch (first)
{
case '*':
{
int second = fgetc(pfIn);
switch (second)
{
case '/':
{
int third = fgetc(pfIn);
switch (third)
{
case '\n':
fputc('\n', pfOut);
*state = NUL_STATE;
break;
case '/':
fputc(first, pfOut);
fputc(second, pfOut);
fputc(third, pfOut);
*state = C_STATE;
break;
default:
fputc('\n', pfOut);
fputc(third, pfOut);
*state = NUL_STATE;
break;
}
}
//fputc('\n', pfOut);
//*state = NUL_STATE;
break;
default:
fputc(first, pfOut);
ungetc(second, pfIn);
break;
}
}
break;
case '\n':
{
fputc('\n', pfOut);
fputc('/', pfOut);
fputc('/', pfOut);
*state = C_STATE;
}
break;
case EOF:
*state = END_STATE;
break;
default:
fputc(first, pfOut);
break;
}
}
void DoCppState(FILE *pfIn, FILE *pfOut, enum State *state)
{
int first = fgetc(pfIn);
switch (first)
{
case '\n':
{
fputc('\n', pfOut);
*state = NUL_STATE;
}
break;
case EOF:
*state = END_STATE;
break;
default:
fputc(first, pfOut);
break;
}
}
void commentconvert(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;
}
}
}
以下是此代码测试的几种情况: