这篇博客主要内容是注释转换, 就是把C语言风格的注释/* ~~~~~~~~~~*/转换成C++风格 //
其中有一些文件操作函数,不懂的可以看这篇博客:
https://blog.youkuaiyun.com/abc_xixi111/article/details/80377450
首先,我们要知道一个文件中至少有五种状态,我们用状态图表示
解读:
我们从 不是注释 的状态开始,请看下图
有以下几种情况需要注意:
/* ~~~ */ 转变成 //~~~
/* ~~ 转变成 //~~
~~ //~~
~~ */ ~~~~ //~~
~~~~
判断是否为换行,如果换行需要输入//
/*~~~~~~~**/ 转变成 //~~~~~~~~~*
如果准备出注释的时候,遇到*先保留看下一个字符是不是/,如果是/,在判断下一个字符是不是换行,不是换行就输入一个换行,就到下一行
下面是input.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*/
源文件注释转换.c
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef enum state{
NO_ZHUSHI,
REDAY_GO,
C_COM,
CPP_COM,
REDAY_OUT
} State;
int main()
{
FILE *pIn = fopen("input.c", "r");//以读方式打开文件
assert(pIn != NULL);
FILE *pOut = fopen("output.c", "w");//以写方式打开文件
assert(pOut != NULL);
int ch, nextch;
State state = NO_ZHUSHI;//开始状态为 不是注释
while (1)
{
ch = fgetc(pIn);
if (ch == EOF)
break;
switch (state)
{
case NO_ZHUSHI:
if (ch == '/'){
fputc(ch, pOut);
state = REDAY_GO;
}
else
{
fputc(ch, pOut);
state = NO_ZHUSHI;
}
break;
case REDAY_GO:
if (ch == '/'){
fputc(ch, pOut);
state = CPP_COM;
}
else if (ch = '*'){
fputc('/', pOut);
state = C_COM;
}
else{
fputc(ch, pOut);
state = NO_ZHUSHI;
}
break;
case CPP_COM:
if (ch == '\n')
{
fputc(ch, pOut);
state = NO_ZHUSHI;
}
else
{
fputc(ch, pOut);
state = CPP_COM;
}
break;
case C_COM:
if (ch == '*')
{
state = REDAY_OUT;
}
else
{
if (ch == '\n'){
fputc("/", pOut);
fputc("/", pOut);
}
state = C_COM;
}
break;
case REDAY_OUT:
if (ch == '/')
{
nextch = fgetc(pIn);
if (nextch != '\n')
{
fputc('\n', pOut);
}
ungetc(nextch, pIn);
state = NO_ZHUSHI;
}
else if (ch == '*')
{
fputc('*', pOut);
state = REDAY_OUT;
}
else
{
fputc('*', pOut);
fputc(ch, pOut);
state = C_COM;
}
break;
}
}
fclose(pOut);
fclose(pIn);
system("pause");
return 0;
}