简单操作:将以下注释全部转为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*/
可用有限状态机解决该问题:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
typedef enum State {
NOT_COMMENT, // 不是注释
MAYBE_IN, // 可能进注释
C_COMMENT, // C 风格
CPP_COMMENT, // C++ 风格
MAYBE_OUT // 可能出注释(C)
} State;
int main()
{
FILE *pIn;
FILE *pOut;
int ch, nextCh;
State state = NOT_COMMENT;
const char *stateStr[] = {
"不是注释", "可能进注释", "C 风格",
"C++ 风格", "可能出注释(C)"
};
pIn = fopen("input.c", "r");
if (pIn == NULL) {
perror("");
system("pause");
return 1;
}
pOut = fopen("output.c", "w");
if (pOut == NULL) {
perror("");
system("pause");
fclose(pIn);
return 1;
}
while (1) {
ch = fgetc(pIn);
if (ch == EOF) {
break;
}
switch (state) {
case NOT_COMMENT:
if (ch == '/') {
state = MAYBE_IN;
fputc(ch, pOut);
}
else {
state = NOT_COMMENT;
fputc(ch, pOut);
}
break;
case MAYBE_IN:
if (ch == '/') {
state = CPP_COMMENT;
fputc(ch, pOut);
}
else if (ch == '*') {
state = C_COMMENT;
fputc('/', pOut);
}
else {
state = NOT_COMMENT;
fputc(ch, pOut);
}
break;
case C_COMMENT:
if (ch == '*') {
state = MAYBE_OUT;
}
else {
state = C_COMMENT;
fputc(ch, pOut);
if (ch == '\n') {
fprintf(pOut, "//");
}
}
break;
case CPP_COMMENT:
if (ch == '\n') {
state = NOT_COMMENT;
fputc(ch, pOut);
}
else {
state = CPP_COMMENT;
fputc(ch, pOut);
}
break;
case MAYBE_OUT:
if (ch == '/') {
state = NOT_COMMENT;
nextCh = fgetc(pIn);
if (nextCh != '\n') {
fputc('\n', pOut);
}
ungetc(nextCh, pIn);
}
else if (ch == '*') {
state = MAYBE_OUT;
fputc('*', pOut);
}
else {
state = C_COMMENT;
fputc('*', pOut);
fputc(ch, pOut);
}
break;
}
printf("%c: 当前状态是: %s\n", ch, stateStr[state]);
}
fclose(pOut);
fclose(pIn);
return 0;
}
转为C++风格注释为:
// 1.一般情况
// int i = 0;
// 2.换行问题
// int i = 0;
int j = 0;
// int i = 0;
int m = 0;
// 3.匹配问题
//int i = 0;/*xxxxx
// 4.多行注释问题
//
//int i=0;
//int j = 0;
//int k = 0;
//
int k = 0;
// 5.连续注释问题
//
//
// 6.连续的**/问题
//*
// 7.C++注释问题
// /*xxxxxxxxxxxx*/