您的位置:首页 > 编程语言 > C语言/C++

【C语言】注释转换项目实现

2017-05-28 12:47 507 查看
编写一个小项目将一个一个文件中的注释都转换成C++的注释风格

设计部分:

(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息