这个程序的目的是:把C注释全部转换为C++注释
程序有以下几个状态:
1、无状态:代码的正文部分
2、C状态:注释方式为C注释
3、C++状态:注释方式为C++注释
4、END:结束状态
这几种状态的关系
首先我们要打开input.c文件,对这个文件内部的文件进行读取,然后处理,否则直接提示用户有错误。 接下来,我们还要打开output.c文件,对处理以后的代码进行写入。
转换机制:先创建一个状态机,在读取到文件时将初始状态先设为NULL_STATE,然后通过fputc函数
从文件中按一个字符一个字符的方式来读取,当读到'/*'时,说明接下来读到的是C_STATE状态,然后将状态机的
状态改为C_STATE状态,进入C状态后,接下来就是要判断是否读到'*/',如果读到就将状态机设置为
NULL_STATE状态。当然在进去C状态后还要考虑其他很多情况,具体在代码中来看。当读到'//'时,则进入
CPP_STATE状态,这时将状态机设置为CPP_STATE状态,CPP注释是按照行来注释的,所以判断CPP状态结束
的标志自然就是'\n'了。
input.c
// 1.一般情况
int num = 0;
// int i = 0;
// 2.换行问题
// int i = 0;
int j = 0;
// int i = 0;
int j = 0;
// 3.匹配问题
//int i = 0;/*xxxx
// 4.多行注释问题
//
//int i=0;
//int j = 0;
//int k = 0;
//
int k = 0;
// 5.连续注释问题
//
//
// 6.连续的**/问题
//*
// 7.C++注释问题
// /*xxxxxxxxxxxx*/
注释转换程序
代码实现
CommentConver.h
#ifndef __COMMENT_CONVERT_H__
#define __COMMENT_CONVERT_H__
#define _CRT_SECURE_NO_WARNINGS 0
#include
#include
enum State
{
NUL_STATE,//无注释状态
C_STATE,//C注释状态
CPP_STATE,//C++注释状态
END_STATE//结束状态
};
void DoNulState(FILE* pfIn, FILE* pfOut, enum State* ps);
void DoCState(FILE* pfIn, FILE* pfOut, enum State* ps);
void DoCppState(FILE* pfIn, FILE* pfOut, enum State* ps);
void CommentConvert(FILE* pfIn, FILE* pfOut);
#endif //__COMMENT_CONVERT_H__
CommentConver.c
#include "CommentConvert.h"
void DoNulState(FILE* pfIn, FILE* pfOut, enum State* ps)
{
int first = fgetc(pfIn);
switch (first)
{
case '/':
{
int second = fgetc(pfIn);
switch (second)
{
case '*':
{
fputc('/', pfOut);
fputc('/', pfOut);
*ps = C_STATE;
}
break;
case '/':
{
fputc(first, pfOut);
fputc(second, pfOut);
*ps = CPP_STATE;
}
break;
default:
{
fputc(first, pfOut);
fputc(second, pfOut);
}
break;
}
}
break;
case EOF:
fputc(first, pfOut);
*ps = END_STATE;
break;
default:
fputc(first, pfOut);
break;
}
}
void DoCState(FILE* pfIn, FILE* pfOut, enum State* ps)
{
int first = fgetc(pfIn);
switch (first)
{
case '*':
{
int second = fgetc(pfIn);
switch (second)
{
case '/':
{
int third = fgetc(pfIn);
if (third == '\n')
{
fputc(third, pfOut);
}
else
{
fputc('\n', pfOut);
ungetc(third, pfIn);
}
*ps = NUL_STATE;
}
break;
case '*':
break;
default:
fputc(first, pfOut);
fputc(second, pfOut);
break;
}
}
break;
default:
fputc(first, pfOut);
break;
}
}
void DoCppState(FILE* pfIn, FILE* pfOut, enum State* ps)
{
int first = fgetc(pfIn);
switch (first)
{
case '\n':
{
fputc(first, pfOut);
*ps = NUL_STATE;
}
break;
case EOF:
fputc(first, pfOut);
*ps = END_STATE;
break;
default:
fputc(first, pfOut);
break;
}
}
void CommentConvert(FILE* pfIn, FILE* pfOut)
{
enum State state = NUL_STATE;
while (state != END_STATE)
{
switch (state)
{
case NUL_STATE:
DoNulState(pfIn,pfOut,&state);
break;
case C_STATE:
DoCState(pfIn, pfOut, &state);
break;
case CPP_STATE:
DoCppState(pfIn, pfOut, &state);
break;
}
}
}
test.c
#include"CommentConvert.h"
void test()
{
FILE* pfIn = fopen("input.c", "r");
if (NULL == pfIn)
{
perror("open file for read");
exit(EXIT_FAILURE);
}
FILE* pfOut = fopen("output.c", "w");
if (NULL == pfOut)
{
perror("open file for read");
fclose(pfIn);
pfIn = NULL;
exit(EXIT_FAILURE);
}
//注释转换
CommentConvert(pfIn, pfOut);
fclose(pfIn);
pfIn = NULL;
fclose(pfOut);
pfOut = NULL;
}
int mian()
{
test();
return 0;
}