编写一个小项目将一个一个文件中的注释都转换成C++的注释风格
设计部分:
(1)头文件模块:包括模块中需要引用的头文件定义,需要实现的主要函数的声明
(2)头文件中主要函数模块的实现:各个函数部分实现的细节
(3)测试函数:检验函数模块的功能
(4)写入一个输入文件
(5)运行结果记入一个输出文件中
原始输入部分(input.c)
// 1.一般情况
/* int i = 0; */
// 2.换行问题
/* int i = 0; */int j = 0;
///* int i = 0; */int j = 0;
// 3.匹配问题
/*int i = 0;/*xxxxx*/
// 4.多行注释问题
/*
int i=0;
int j = 0;
int k = 0;
*/int k = 0;
// 5.连续注释问题
/**//**/
// 6.连续的**/问题
/***/
// 7.C++注释问题
// /*xxxxxxxxxxxx*/
//头文件模块
#ifndef __COMMENTCONVERT_H__
#define __COMMENTCONVERT_H__
#include <stdio.h>
#include <stdlib.h>
#define INPUT "input.c"
#define OUTPUT "output.c"
enum KIND //定义一个枚举常量来表示要执行的选项的操作
{
END_START,
NULL_START,
C_START,
Cpp_START,
};
void CommentConvert(FILE *pfin, FILE *pfout); //注释转换操作函数
void DoNullState(FILE *pfin, FILE *pfout,enum KIND *sta); //普通字符转换函数
void DoCState(FILE *pfin, FILE *pfout,enum KIND *sta); //c语言注释转换为c++注释函数
void DoCppState(FILE *pfin, FILE *pfout,enum KIND *sta); //c++注释转换函数
#endif //__COMMENTCONVERT_H__
#define _CRT_SECURE_NO_WARNINGS 1
//函数具体功能实现模块实现
#include"CommentConvert.h"
void DoNullState(FILE *pfin, FILE *pfout,enum KIND *sta) //普通字符转换函数
{
int first=0;
int second=0;
first=fgetc(pfin);
switch(first)
{
case '/':
{
fputc(first,pfout);
second = fgetc(pfin);
switch(second)
{
case '/': //如果是//将second输出,进入c++注释部分
fputc(second,pfout);
*sta = Cpp_START;
break;
case '*': //如果是/*就将*改为/输出,进入c注释部分
fputc('/',pfout);
*sta = C_START;
break;
default:
fputc(second,pfout);
break;
}
break;
case EOF: //文件结束
fputc(first,pfout);
*sta=END_START;
break;
default: //其他字符
fputc(first,pfout);
break;
}
}
}
void DoCState(FILE *pfin, FILE *pfout,enum KIND *sta) //c语言注释转换为c++注释函数
{
int first = 0;
int second = 0;
first=fgetc(pfin);
switch(first)
{
case '/':
fputc(first,pfout);
break;
case '*':
{
second=fgetc(pfin);
switch(second)
{
case '*':
fputc(first,pfout);
ungetc(second,pfout); //将*之后的内容放到缓存区
break;
case '/':
{
int third=fgetc(pfin);
*sta=NULL_START;
if(third == '\n') //判断注释之后是否需要主动换行的情况
{
fputc('\n',pfout);
}
else
{
fputc('\n',pfout);
ungetc(third,pfin);
}
}
break;
default:
fputc(first,pfout);
fputc(second,pfout);
break;
}
}
break;
case '\n':
second=fgetc(pfin);
switch(second)
{
case '*':
{
int third=fgetc(pfin);
if(third == '/')
{
fputc('\n',pfout);
*sta = NULL_START;
}
else
{
fputc('/',pfout);
fputc('/',pfout);
fputc(second,pfout);
fputc(third,pfout);
}
break;
}
default:
fputc('\n',pfout);
fputc('/',pfout);
fputc('/',pfout);
ungetc(second,pfin);
break;
}
break;
default:
fputc(first,pfout);
break;
}
}
void DoCppState(FILE *pfin, FILE *pfout,enum KIND *sta) //c++注释转换函数
{
int first = 0;
first = fgetc(pfin);
switch(first)
{
case '\n':
fputc(first,pfout);
*sta = NULL_START;
break;
default:
fputc(first,pfout);
break;
}
}
void CommentConvert(FILE *pfin, FILE *pfout) //注释转换操作函数
{
int input=0;
int output=0;
enum KIND str = NULL_START;
while(str!=END_START)
{
switch(str)
{
case NULL_START:
DoNullState(pfin, pfout, &str);
break;
case C_START:
DoCState(pfin, pfout, &str);
break;
case Cpp_START:
DoCppState(pfin, pfout, &str);//c++注释转换函数
break;
case END_START:
break;
default:
break;
}
}
printf("转换成功!\n");
fclose(pfin);
fclose(pfout);
}
#define _CRT_SECURE_NO_WARNINGS 1
//测试模块部分
#include <stdio.h>
#include <stdlib.h>
#include"CommentConvert.h"
int main()
{
FILE *pfout = NULL;
FILE *pfin = NULL;
pfin = fopen(INPUT,"r"); //以读的形式打开文件
if(pfin == NULL)
{
perror("not open file");
exit(EXIT_FAILURE);
}
pfout=fopen(OUTPUT,"w"); //写入文件
if(pfout == NULL)
{
perror("not open file");
fclose(pfin);
exit(EXIT_FAILURE);
}
CommentConvert(pfin,pfout); //注释转换操作函数
system("pause");
return 0;
}
//转换成功部分(outpu.c)
// 1.一般情况
// int i = 0;
// 2.换行问题
// int i = 0;
int j = 0;
///* int i = 0; */int j = 0;
// 3.匹配问题
//int i = 0;/*xxxxx
// 4.多行注释问题
//
//int i=0;
//int j = 0;
//int k = 0;
int k = 0;
// 5.连续注释问题
//
//
// 6.连续的**/问题
//*/
//
7.C++注释问题
/*xxxxxxxxxxxx