这道题对于新手来说,刚开始理解起来,确实有点难度。然而事实的真相却是相当简单,只要有一点字符操作经验的人都能够掌握。
不多说,进入正题:
我们的目标是将C语言中的注释转化为C++注释风格。
C注释风格: /**/
C++风格://
我们要采用文件操作来实现函数。
对一个文件我们要根据 “读”的字符,去判断他是哪一种风格。
/* 我们可以知道它是C注释风格了 函数中我们用C_STATE枚举常量表示,进行相应的C-》C++的转化
// 我们可以知道它是C++注释风格了 函数中我们用CPP_STATE枚举表示,进行C++的转化
其他的我们可以认为是正常字符 函数中我们用NORMAL_STATE枚举表示,进行C-》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*/
方便大家拷贝
首先头文件准备:
convert.h
#ifndef _COMMENT_CONVERT_H
#define _COMMENT_CONVERT_H
#include<stdio.h>
#include<stdlib.h>
#define READFILENAME "input.txt"
#define WRITEFILENAME "output.txt"
//风格的几种状态进行编制
static enum STATE
{
NORMAL_STATE,
C_STATE,
CPP_STATE,
END_STATE,
};
void CommentConvert(FILE*fRead, FILE*fWrite);//转换函数
void Do_C_State(FILE*fRead, FILE*fWrite);//对C注释进行转换
void Do_Cpp_State(FILE*fRead, FILE*fWrite);//对C++注释进行转换
void Do_Normal_State(FILE*fRead, FILE*fWrite);//正常字符处理,以及风格分类
#endif
接下来,就是测试部分了,
test.c
#include"convert.h"
#pragma warning(disable:4996)
int main()
{
printf("*******开始转换注释********\n\n\n");
FILE*fRead = fopen(READFILENAME, "r");
if (fRead == NULL)
{
perror("fopen");
exit(EXIT_FAILURE);
}
FILE*fWrite = fopen(WRITEFILENAME, "w");
if (NULL == fWrite)
{
perror("fopen");
exit(EXIT_FAILURE);
}
CommentConvert(fRead, fWrite);
printf("*******注释转换结束*****\n");
fclose(fRead);
fclose(fWrite);
getchar();
return 0;
}
最后各个函数实现部分
main.c
#include"convert.h"
enum STATE state = NORMAL_STATE;
void CommentConvert(FILE*fRead, FILE*fWrite)
{
while (state != END_STATE)
{
switch (state)
{
case NORMAL_STATE:
Do_Normal_State(fRead,fWrite);
break;
case C_STATE:
Do_C_State(fRead, fWrite);
break;
case CPP_STATE:
Do_Cpp_State(fRead, fWrite);
break;
default:
break;
}
}
}
void Do_C_State(FILE*fRead, FILE*fWrite)
{
char first = 0;
char second = 0;
char third = 0;
first = fgetc(fRead);
switch (first)
{
case'*':
second = fgetc(fRead);
switch (second)
{
case '/':
third = fgetc(fRead);
if (third != '\n')
{
fputc('\n', fWrite);
}
if (third=='/')
{
ungetc(third, fRead);
state = NORMAL_STATE;
break;
}
fputc(third, fWrite);
state = NORMAL_STATE;
break;
case '*':
third = fgetc(fRead);
fputc(first, fWrite);
if (third == '/')
{
state = NORMAL_STATE;
}
break;
default:
fputc(first, fWrite);
fputc(second, fWrite);
break;
}
break;
case '\n':
putc(first, fWrite);
putc('/', fWrite);
putc('/', fWrite);
break;
case EOF:
state = END_STATE;
default:
fputc(first, fWrite);
break;
}
}
void Do_Cpp_State(FILE*fRead, FILE*fWrite)
{
char first = 0;
first = fgetc(fRead);
switch (first)
{
case'\n':
fputc(first, fWrite);
state = NORMAL_STATE;
break;
case EOF:
state = END_STATE;
break;
default:
fputc(first, fWrite);
break;
}
}
void Do_Normal_State(FILE*fRead, FILE*fWrite)
{
char first = 0;
char second = 0;
first = fgetc(fRead);
switch (first)
{
case '/':
second = fgetc(fRead);
if (second == '*')
{
putc('/', fWrite);
putc('/', fWrite);
state = C_STATE;
}
else if (second == '/')
{
fputc(first, fWrite);
fputc(second, fWrite);
state = CPP_STATE;
}
else
{
fputc(first, fWrite);
fputc(second, fWrite);
}
break;
case EOF:
state = END_STATE;
default:
fputc(first, fWrite);
break;
}
}
DOS结果: