您的位置:首页 > 其它

注释转换

2016-04-03 11:40 316 查看
将c语言的注释转换成c++的注释

测试用例:

1.一般情况

/* int a = 0; */


2.连续*

/***/


3.换行问题

/* int b = 0; */ int c = 0;
/* aaa */
int d = 0;


4.匹配问题

/*AAA/*BBB*/
/*int e = 0;/*xxxxxx*/


5.多行注释

/*
AAA
BBB
CCC
*/int aa;


6.连续注释

/*aaa*//*bbb*/


7.c++注释 (遇到c++注释直接读完一行)

// /**/


Annotation conversion.c

# include<stdio.h>
# include<stdlib.h>

enum Tag
{
C_BEGIN,
C_END,
};

void Convert(const char* fIn,char* fOut)
{
FILE* Input = fopen(fIn, "r");
if (NULL == Input)
{
printf("打开文件%s失败\n",fIn);
return;
}
FILE* Output = fopen(fOut, "w");
if (NULL == Input)
{
printf("打开文件%s失败\n", fOut);
return;
}

Tag tag = C_END;
char ch = fgetc(Input);
char second;
while (ch != EOF)
{
switch (ch)
{
case '/':
fputc('/', Output);
second = fgetc(Input);
if (second == '*')
{
//4.匹配问题
if (tag == C_END)
{
fputc('/', Output);
tag = C_BEGIN;
}
else
{
fputc('*', Output);
}
}
else if (second == '/')     // 7. 碰到c++注释,读完一行
{
fputc(second, Output);
char cur;
do
{
cur = fgetc(Input);
if (cur == EOF)
{
return;
}
fputc(cur, Output);
} while (cur != '\n');
}
else
{
fputc(second, Output);
}
break;
case '*':
second = fgetc(Input);
if (second == '/' && tag == C_BEGIN)
{
//  3. 换行问题
char next = fgetc(Input);
if (next != '\n' && next != EOF)
{
fputc('\n', Output);
fseek(Input, -1, SEEK_CUR); //6.连续注释  /**//**/
}
else
{
fputc(next, Output);
}
tag = C_END;
}
else                      //   2. /***/
{
fputc('*', Output);
fseek(Input, -1, SEEK_CUR);
}
break;
case '\n':
fputc('\n', Output);
// 5. 多行注释
if (tag == C_BEGIN)
{
fputc('/', Output);
fputc('/', Output);
}
break;
default:
fputc(ch, Output);
}
ch = fgetc(Input);
}
fclose(Input);
fclose(Output);
}

void Test()
{
Convert("Input.cpp","Output.cpp");
}
int main()
{
Test();
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: