要想实现C->C++的注释转换,首先要画出注释转换的状态图:
1.如果碰到的是//,则直接进入C++注释转换中,可以直接将该行字符全部读取并输入。
2.如果碰到的是/,则代表着C注释的开始,这里需要对/是否有字符,以及*/后面是否还接有下一个注释的开始进行判断。
3.如果碰到EOF状态,便可以直接退出。
程序实现:
CommentConvert.h
#ifndef __FILE__COMMENT_CONVERT__
#define __FILE__COMMENT_CONVERT__
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
enum STATE
{
NUL_STATE,
C_STATE,
CPP_STATE,
END_STATE
};
void DoNUL(FILE *pfin, FILE * pfout, STATE *state); //NUL状态
void DoC(FILE *pfin, FILE * pfout, STATE *state); //C注释状态
void DoCpp(FILE *pfin, FILE *pfout, STATE *state); //C++注释状态
#endif
CommentConvert.cpp
#include "CommentConvert.h"
void DoNUL(FILE *pfin, FILE * pfout, STATE *state)
{
int first = 0;
int second = 0;
//int third = 0;
first = fgetc(pfin);
switch (first)
{
case '/': //第一个字符为 /
second = fgetc(pfin);
switch (second)
{
case '/': //当读取字符为 // 时 CPP注释开始
fputc(first,pfout);
fputc(second, pfout);
*state = CPP_STATE; //先将 // 放入pfout
break;
case '*': //当读取字符为 /* 时 C注释开始
fputc('/', pfout);
fputc('/', pfout);
*state = C_STATE; //先将//放入pfout
break;
default: //当读取字符不是上面情况 直接放入pfout
fputc(first, pfout);
fputc(second, pfout);
break;
}
break;
case EOF:
*state = END_STATE; //结束
break;
default: //读取的第一个字符不为 / 直接放入
fputc(first,pfout);
break;
}
}
void DoCpp(FILE *pfin, FILE *pfout, STATE *state) //C++注释模式 直接向后添加 碰到EOF结束
{
int first = 0;
first = fgetc(pfin);
switch (first)
{
case '\n':
{
fputc(first, pfout);
*state = NUL_STATE;
}
break;
case EOF:
*state = END_STATE;
break;
default:
fputc(first, pfout);
break;
}
}
void DoC(FILE *pfin, FILE * pfout, STATE *state)
{
int first = 0;
int second = 0;
int third = 0;
first = fgetc(pfin);
switch (first)
{
case '*': //如果是*则需要判断是否结束
second = fgetc(pfin);
switch (second)
{
case '*': //如果下一个字符是*,则输出一个*并范围上一次的位置
{
ungetc(second, pfin);
fputc(first, pfout);
}
break;
case '/': // ?是否需要 换行
{
third = fgetc(pfin);
switch (third)
{
case '\n':
fputc(third, pfout);
break;
default:
fputc('\n',pfout);
ungetc(third, pfin);
break;
}
*state = NUL_STATE;
}
break;
default: //其他字符直接输出
{
fputc(first, pfout);
fputc(second, pfout);
}
}
break;
case '\n':
{
fputc(first, pfout);
fputc('/',pfout);
fputc('/', pfout);
}
break;
default:
fputc(first, pfout);
break;
}
}
test.cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include "CommentConvert.h"
//ungetc(second,pfin);
void test()
{
enum STATE state = NUL_STATE;
FILE *pfin = fopen("input.c", "r");
if (pfin == NULL)
{
perror("pfin fopen");
exit(EXIT_FAILURE);
}
FILE *pfout = fopen("output.c", "w");
if (pfout == NULL)
{
perror("pfout fopen");
exit(EXIT_FAILURE);
fclose(pfin);
}
while (state != END_STATE)
{
switch (state)
{
case NUL_STATE:
DoNUL(pfin, pfout, &state);
break;
case C_STATE:
DoC(pfin, pfout, &state);
break;
case CPP_STATE:
DoCpp(pfin, pfout, &state);
break;
}
}
fclose(pfin);
fclose(pfout);
}
int main()
{
test();
system("pause");
return 0;
}
程序调试: