用该程序将文件中的C语言风格的注释(/* */)改成C++风格的注释 ( // )
先找出注释为哪种风格的注释,首先有五种状态:普通状态(无注释) , 找到 ” / “ 状态 ,c风格注释(即找到**/),找到 * 状态 ,c++风格注释(即找到另一个/)
可以画一个图来解释,能更加清楚一点。
下图为找到一个完整的C风格注释过程示意图。
找到C++风格注释过程的示意图如下:
将状态state定义为枚举类型
用switch case语句完成转换,在转换过程中有以下八种情况:
代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<Windows.h>
enum State {
NORMAL,//普通
FOUND_SLASH,//找到‘/’
C_COMMENT,//C风格注释
CPP_COMMENT,//C++风格注释
FOUND_ASTERISK//找到‘*’
};
void CommentConvert(FILE *pIn, FILE * pOut)
{
enum State state = NORMAL;
char ch ,nextCh;
while (1)
{
ch = fgetc(pIn);
if (ch = EOF)
{
break;
}
}
switch (state)
{
case NORMAL:
if (ch == '/')
{//(1)
state = FOUND_SLASH;
}
else
{
state = NORMAL;
fputc(ch,pOut);
}
break;
case FOUND_SLASH:
if (ch == '*')
{
fprintf(pOut, "//");
state = C_COMMENT;
}
else if (ch == '/')
{
fprintf(pOut, "//");
state = CPP_COMMENT;
}
else
{
fputc('/', pOut);
fputc(ch, pOut);
state = NORMAL;
}
break;
case C_COMMENT:
if (ch == '*')
{
state = FOUND_ASTERISK;
}
else
{
fputc(ch, pOut);
if (ch == '/n')
{
fprintf(pOut, "//");
}
state = C_COMMENT;
}
break;
case FOUND_ASTERISK:
if (ch == '/')
{
nextCh = fgetc(pIn);
if (nextCh != '\n')
{
fputc('\n', pOut);
}
ungetc(nextCh, pIn);
state = NORMAL;
}
else if (ch == '*')
{
fputc('*', pOut);
state = FOUND_ASTERISK;
}
else
{
fputc('*', pOut);
fputc(ch, pOut);
state = C_COMMENT;
}
break;
case CPP_COMMENT:
if (ch == '\n')
{
state = NORMAL;
fputc(ch, pOut);
}
else
{
state = CPP_COMMENT;
fputc(ch, pOut);
}
break;
}
const char *message[] ={
"普通状态",
"找到/",
"C风格注释状态",
"找到*",
"C++风格注释状态"
};
printf("找到:%c,当前状态:%s\n", ch, message[state]);
Sleep(1000);
}
主函数
int main()
{
const char *INPUT = "input.c";
const char * OUTPUT = "output.c";
FILE *pIn = fopen(INPUT, "r");
assert(pIn != NULL);
FILE *pOut = fopen(OUTPUT, "w");
assert(pOut != NULL);
CommentConvert(pIn, pOut);
system("pause");
fclose(pOut);
fclose(pIn);
return 0;
}