C语言注释风格:/* ####### */(可以注释单行,也可以注释多行)
C++语言注释风格:// ######
// ######
而C语言的注释风格是有缺陷的,它不能嵌套使用,因此我们可将C注释风格改为C++注释风格。
C语言注释转换分为四种状态:NUL_STATE(无状态);C_STATE(C注释状态);CPP_STATE(C++注释状态);END_STATE(结束状态)。
如下图,介绍了几种状态之间的转换关系。
以下是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;/*xxxxx*/
//4.多行注释问题
/*
int i = 0;
int j = 0;
int k = 0;
*/int k = 0;
//5.连续注释问题
/**//**/
//6.连续的**/问题
/**/
//7.C++注释问题
// /*xxxxxxxxx*/
程序代码如下:
CommentConvert.h
#ifndef __COMMENT_CONVERT_H__
#define __COMMENT_CONVERT_H__
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
enum STATE
{
END_STATE,
NUL_STATE,
C_STATE,
CPP_STATE
};
void DoNulState(FILE*pfIn, FILE*pfOut, enum STATE*s);//普通字符转换函数
void DoCState(FILE*pfIn, FILE*pfOut, enum STATE*s);//C语言注释转换为C++注释函数
void DoCppState(FILE*pfIn, FILE*pfOut, enum STATE*s);//C++注释转换函数
#endif//__COMMENT_CONVERT_H__
CommentConvert.c
#include"CommentConvert.h"
void DoNulState(FILE*pfIn, FILE*pfOut, enum STATE*s)//开始无状态
{
int first = 0;
first = fgetc(pfIn);
switch (first)
{
case '/'://第一个读取到'/'
{
int sceond = fgetc(pfIn);
switch (sceond)
{
case '/'://第二个也读取‘/’,c++注释
{
*s = CPP_STATE;
fputc(first, pfOut);
fputc(sceond, pfOut);
}
break;
case '*'://第二个读取到*为c的注释
{
*s = C_STATE;
fputc('/', pfOut);
fputc('/', pfOut);
}
break;
default:// 其他非注释情况直接读取
{
fputc(first, pfOut);
fputc(sceond, pfOut);
}
break;
}
}
break;
case EOF://直接文件读取结束
{
*s = END_STATE;
}
break;
default:
{
fputc(first, pfOut);
}
break;
}
}
void DoCState(FILE*pfIn, FILE*pfOut, enum STATE*s)//C注释状态
{
int first = 0;
first = fgetc(pfIn);
switch (first)
{
case '*'://结尾读取到*
{
int sceond = 0;
sceond = fgetc(pfIn);
switch (sceond)
{
case '/'://一般情况:/* int i = 0; */
{
*s = NUL_STATE;//不需要操作
fputc('\n', pfOut);
}
break;
case '*'://连续注释问题如:/*//*/
{
fputc(first, pfOut);
ungetc(sceond, pfIn);
}
break;
default://其它非注释情况
{
fputc(first, pfOut);
fputc(sceond, pfOut);
}
}
}
break;
case '\n'://多行注释问题
{
fputc(first, pfOut);
fputc('/', pfOut);
fputc('/', pfOut);
}
break;
default://结尾直接是其他非注释情况
{
fputc(first, pfOut);
}
break;
}
}
void DoCppState(FILE*pfIn, FILE*pfOut, enum STATE*s)//c++注释状态
{
int first = 0;
first = fgetc(pfIn);
switch (first)
{
case '\n'://一般情况
{
fputc(first, pfOut);
*s = NUL_STATE;
}
break;
case EOF://文件读取结束
{
*s = END_STATE;
}
break;
default://其他非注释情况
fputc(first, pfOut);
break;
}
}
test.c
#include "CommentConvert.h"
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;
}
}
}
void test()
{
FILE *pfIn = fopen("input.c", "r");//从文件里面读取东西
if (pfIn == NULL)
{
perror("use open file read");
exit(EXIT_FAILURE);
}
FILE *pfOut = fopen("output.c", "w");//往文件里面写东西
if (pfOut == NULL)
{
perror("use open file write");
exit(EXIT_FAILURE);
}
CommentConvert(pfIn, pfOut);//调用转换函数
fclose(pfIn);
fclose(pfOut);
}
int main()
{
test();
system("pause");
return 0;
}
注释转换结果如下: