在c语言中支持嵌套注释,而c++语言不支持
c注释风格:/* */
c++注释风格://
那么如何将c注释转换为c++注释呢?
大致有以下情况:
1.单行注释/* int i=0;*/
2./* int j=0;*/int k=0;/* int m=0;*/
int n=0;
3.
/* int a=0;/*xxxx*/
4.多行注释
/*
int b=0;
int c=0;
int d=0;
*/int e=0;
5./**//**/
6./****/
7.// /*xxxxxxx*/
源代码如下:
#ifndef _COMMENT_CONVERT_H__
#define _COMMENT_CONVERT_H__
#include
#include
#define INFILE_NAME "input.c"
#define OUTFILE_NAME "output.c"
typedef enum Status//枚举类型定义四种状态
{
No_Status,
C_Status,
Cpp_Status,
END
}Status;
void DoConvertWork(FILE* pfin,FILE* pfout);//无注释状态
void DoNo_Convert(Status* ps,FILE* pfin,FILE* pfout);//结束状态
void DoC_Convert(Status* ps,FILE* pfin,FILE* pfout);//c注释状态
void DoCpp_Convert(Status* ps,FILE* pfin,FILE* pfout);//c++注释状态
#endif //_COMMENT_CONVERT_H__
#include "commentconvert.h"
void DoConvertWork(FILE* pfin,FILE* pfout)//转换工作
{
Status status=No_Status;//无状态
while(status!=END)
{
switch(status)
{
case No_Status:
DoNo_Convert(&status,pfin,pfout);
break;
case C_Status:
DoC_Convert(&status,pfin,pfout);
break;
case Cpp_Status:
DoCpp_Convert(&status,pfin,pfout);
break;
default :
break;
}
}
exit(1);
}
void DoNo_Convert(Status* ps,FILE* pfin,FILE* pfout)//无状态
{
int first=fgetc(pfin);//获取文件中的首字符
switch(first)
{
case '/':
{
int second=fgetc(pfin);//获取第二个字符
switch(second)
{
case '/'://遇到//转c++状态
*ps=Cpp_Status;
break;
case '*'://遇到/*转c注释状态
fputc('/',pfout);// 输出时加上/
fputc('/',pfout);
*ps=C_Status;、
break;
default:
fputc('/',pfout);//输出/
fputc(second,pfout);//输出字符
*ps=No_Status;
}
}
break;
case EOF://EOF为文件结束标志
*ps=END;
break;
default:
fputc(first,pfout);
*ps=No_Status;
break;
}
}
void DoC_Convert(Status* ps,FILE* pfin,FILE* pfout)
{
int first=fgetc(pfin);
switch(first)
{
case '*':
{
int second=fgetc(pfin);
switch(second)
{
case '*':
ungetc('*',pfin);// /**第二个*为文件中的字符,而非注释符,将其换回读出的文件
fputc(second,pfout);
*ps=C_Status;
break;
case '/':
fputc('\n',pfout);
*ps=No_Status;
break;
default:
fputc('*',pfout);
fputc(second,pfout);
*ps=C_Status;
break;
}
}
break;
case '\n':
{
fputc('\n',pfout);
fputc('/',pfout);
fputc('/',pfout);
*ps=C_Status;
}
break;
case '/':
{
int second=fgetc(pfin);
switch(second)
{
case '*':
fputc('/',pfout);
fputc('/',pfout);
*ps=C_Status;
break;
case '/':
fputc('/',pfout);
fputc('/',pfout);
*ps=Cpp_Status;
break;
default :
fputc('/',pfout);
fputc(second,pfout);
*ps=C_Status;
}
}
break;
default:
fputc(first,pfout);
*ps=C_Status;
}
}
void DoCpp_Convert(Status* ps,FILE* pfin,FILE* pfout)
{
int first=fgetc(pfin);
switch(first)
{
case '/':
{
int second=fgetc(pfin);
switch(second)
{
case '*':
fputc('/',pfout);
fputc('/',pfout);
*ps=C_Status;
break;
default :
*ps=Cpp_Status;
break;
}
break;
}
case EOF:
*ps=END;
break;
case '\n':
fputc('/n',pfout);
*ps=No_Status;
break;
default:
fputc(first,pfout);
*ps=Cpp_Status;
break;
}
}
#define _CRT_SECURE_NO_WARNINGS 1
#include "commentconvert.h"
void test()
{
FILE *pfin=NULL;
FILE *pfout=NULL;
pfin=fopen(INFILE_NAME,"r");
if(pfin==NULL)
{
perror("open file for read");
exit(1);
}
pfout=fopen(OUTFILE_NAME,"w");
if(pfout==NULL)
{
perror("open file for write");
fclose(pfin);
exit(1);
}
DoConvertWork(pfin,pfout);
fclose(pfin);
fclose(pfout);
}
int main()
{
test();
return 0;
}
执行结果如下:
// int i=0;
// int j=0;
int k=0;
// int m=0;
int n=0;
// int a=0;//xxxx
//
//int b=0;
//int c=0;
//int d=0;
//
int e=0;
//
//
//**
//xxxxxxx