我们在写程序时,为了增加程序的可读性,经常会写注释,帮助人们的理解,前面已经介绍过了,注释分为C语言风格注释和c++注释,c语言注释可以同时注释多行,但是不支持嵌套,c++风格注释一次可以注释一行,为了避免出错,人们通常选择c++注释;下面的程序就是将一个文件中的c风格注释全部改为c++风格注释。
分析:在编写这个程序时,我们需要考虑这样这几种情况:
1、当读一行代码,如果他的第一个字符不是‘/’,那么他一定不是被注释的内容;
2、当读入一行的第一个字符是‘/’时,那么就要考虑他是操作符(除),还是c风格注释的第一个字符,还是c++风格注释的第一个字符;
3、当已经判断好了它是c++风格注释,那么其后的内容原样输出就好;
4、如果已经有‘/’和‘’紧挨着出现,这个‘’就不输出,用‘/’代替其输出;
5、准备出注释,若在’/‘后面又出现一个’‘我们又需要判断这个’*‘到底是代码段中的内容,还是c注释的一部分。
所以就出现了这样几个状态:不是注释、准备注释、c++风格注释、c语言风格注释、准备出注释这五个过程;
下图就是分析的状态转换图:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef enum State
{
BUSHI,//不是注释
READY_GO,//准备注释
C_COMMENT,//c语言注释
CPP_COMMENT,//c++注释
READY_OUT//准备出注释
}State;
int main()
{
FILE* pIn = fopen("input.c", "r");
assert(pIn != NULL);
FILE* pOut = fopen("output.c", "w");
assert( pOut != NULL);
int ch = 0;
int nextch = 0;
State state = BUSHI;
while (1)
{
ch = fgetc(pIn);
if (ch == EOF)
break;
switch (state)
{
case BUSHI:
if (ch == '/')
{
fputc(ch, pOut);//输出/
state = READY_GO;//改状态
}
else//表示不是注释,可能是/除法
{
fputc(ch, pOut);
state = BUSHI;//改状态
}
break;
case READY_GO:
if (ch == '/')//是c++注释
{
fputc(ch, pOut);
state = CPP_COMMENT;//改状态
}
else if (ch == '*')//是C语言注释
{
fputc('/', pOut);//将C语言注释改为c++注释
state = C_COMMENT;
}
else
{
fputc(ch, pOut);
state = BUSHI;
}
break;
case C_COMMENT:
if (ch == '*')
{
state = READY_OUT;//暂时留住*,先不输出
}
else
{
fputc(ch, pOut);//将注释里面的内容输出
if (ch == '\n')
{
fputc('/', pOut);
fputc('/', pOut);
}
state = C_COMMENT;
}
break;
case CPP_COMMENT:
if (ch == '\n')//换行了,代表这一行的注释内容已经结束
{
fputc(ch, pOut);
state = BUSHI;
}
else
{
fputc(ch, pOut);//没有换行,就输出注释里面的内容
state = CPP_COMMENT;
}
break;
case READY_OUT:
if (ch== '*')
{
fputc('*', pOut);//代表代码中的*,不是c风格注释里面的*
state = READY_OUT;
}
else if (ch == '/')
{
nextch = fgetc(pIn);//表示在注释结束的这一行还有没有被注释的内容,需要给其换行,并且放在pOut中
if (nextch != "\n")
{
fputc("\n", pOut);
}
ungetc(nextch, pIn);
state = BUSHI;
}
else//输出注释中代码的内容
{
//fputc('*', pOut);
fputc(ch, pOut);
state = C_COMMENT;
}
break;
default:
break;
}
}
fclose(pOut);
fclose(pIn);
system("pause");
return 0;
}
被改变的文件是:
改变后的文件变为: