编写一个小项目将一个一个文件中的注释都转换成C++的注释风格
设计部分:
(1)头文件模块:包括模块中需要引用的头文件定义,需要实现的主要函数的声明
(2)头文件中主要函数模块的实现:各个函数部分实现的细节
(3)测试函数:检验函数模块的功能
(4)写入一个输入文件
实现代码:
设计部分:
(1)头文件模块:包括模块中需要引用的头文件定义,需要实现的主要函数的声明
(2)头文件中主要函数模块的实现:各个函数部分实现的细节
(3)测试函数:检验函数模块的功能
(4)写入一个输入文件
(5)运行结果记入一个输出文件中
主要解决的情况:
// 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*/
实现代码:
//CommentConver.h
#ifndef __COMMENT_CONVER_H__
#define __COMMENT_CONVER_H__
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
enum STATE
{
STATE_NULL,
STATE_C,
STATE_CPP,
STATE_EOF
};
void DoCommentCover(FILE* pfIn, FILE* pfOut);
void DoNULL(FILE* pfIn, FILE* pfOut);
void DoC(FILE* pfIn, FILE* pfOut);
void DoCPP(FILE* pfIn, FILE* pfOut);
#endif
//CommentCover.c
#include "CommentConver.h"
enum STATE state;
void DoNULL(FILE*pfIn,FILE* pfOut)
{
int first = fgetc(pfIn);
int second = 0;
switch (first)
{
case'/':
{
second = fgetc(pfIn);
if (second == '/')
{
state = STATE_CPP;
fputc(first, pfOut);
fputc(second, pfOut);
}
else if (second == '*')
{
fputc(first, pfOut);
fputc('/', pfOut);
state = STATE_C;
}
}
break;
case EOF:
fputc(first, pfOut);
state = STATE_EOF;
break;
default:
fputc(first, pfOut);
break;
}
}
void DoC(FILE* pfIn, FILE* pfOut)
{
int first = fgetc(pfIn);
int second = 0;
int third = 0;
switch (first)
{
case '*':
{
second = fgetc(pfIn);
if (second == '/')
{
third = fgetc(pfIn);
if (third == '\n')
fputc(third, pfOut);
else
{
ungetc(third, pfIn);
fputc('\n', pfOut);
}
state = STATE_NULL;
}
else if (second == '*')
{
ungetc(second, pfIn);
fputc(first, pfOut);
}
else
{
fputc(first, pfOut);
fputc(second, pfOut);
}
}
break;
case '\n':
fputc(first, pfOut);
fputc('\n', pfOut);
fputc('\n', pfOut);
break;
case EOF:
state = STATE_EOF;
default:
fputc(first, pfOut);
break;
}
}
void DoCPP(FILE* pfIn, FILE* pfOut)
{
int first = fgetc(pfIn);
int second = 0;
switch (first)
{
case'\n':
fputc(first, pfOut);
state = STATE_NULL;
break;
case EOF:
fputc(first, pfOut);
state = STATE_EOF;
break;
default:
fputc(first, pfOut);
break;
}
}
void DoCommentCover(FILE* pfIn, FILE* pfOut)
{
state = STATE_NULL;
int first = 0;
while (state!=STATE_EOF)
{
switch (state)
{
case STATE_NULL:
DoNULL(pfIn, pfOut);
break;
case STATE_C:
DoC(pfIn, pfOut);
break;
case STATE_CPP:
DoCPP(pfIn, pfOut);
break;
case STATE_EOF:
exit(EXIT_FAILURE);
break;
default:
break;
}
}
}
//test.c
#include "CommentConver.h"
int main()
{
FILE *pfIn = fopen("input.c", "r");
FILE *pfOut = fopen("output.c", "w");
if (pfIn == NULL)
{
perror("input.c");
exit(EXIT_FAILURE);
}
if (pfOut == NULL)
{
perror("output.c");
fclose(pfIn);
}
DoCommentCover(pfIn, pfOut);
printf("转换成功\n");
fclose(pfIn);
fclose(pfOut);
system("pause");
return 0;
}