將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;
}