【输入】字符串形式的源程序。
【输出】处理之后的字符串形式的源程序。
【题目】设计一个程序,从任意字符串中剔除C语言形式的注释,包括:
- 形如: //…的单行注释;
- 形如: /…/ 的多行注释。
#include <iostream>
using namespace std;
int filePretreatment(FILE *p1, FILE *p2);
int main(void)
{
FILE *inputFp, *outputFp;
if ((inputFp = fopen("input.txt", "r")) == NULL)
{
cout << "无法打开!" << endl;
exit(1);
}
if ((outputFp = fopen("output.txt", "w")) == NULL)
{
cout << "无法写入!" << endl;
exit(1);
}
cout << "去除注释后为:" << endl;
filePretreatment(inputFp, outputFp); // 去除注释并打印保存
fclose(inputFp);
fclose(outputFp);
system("pause");
return 0;
}
int filePretreatment(FILE *p1, FILE *p2)
{
int state = 0;
char ch;
while ((ch = fgetc(p1)) != EOF)
{
if (state == 0)
{
if (ch == '/')
state = 1;
else if (ch == '\'')
state = 5;
else if (ch == '\"')
state = 7;
}
else if (state == 1)
{
if (ch == '*')
state = 2;
else if (ch == '/')
state = 4;
else
{
cout << "/";
fputc('/', p2);
state = 0;
}
}
else if (state == 2)
{
if (ch == '*')
state = 3;
else
state = 2; // 遇到其它字符,依旧处于注释状态
}
else if (state == 3)
{
if (ch == '/')
state = 0;
else
state = 2;
}
else if (state == 4)
{
if (ch != '\n' && ch != '\\') // ch == '\n' 出错
state == 4;
else if (ch == '\\')
state = 9;
else
state = 0;
}
else if (state == 9)
{
if (ch == '\\')
state = 9;
else
state = 4;
}
else if (state == 5)
{
if (ch == '\\')
state = 6;
else if (ch == '\'')
state = 0;
}
else if (state == 6)
state = 5;
else if (state == 7)
{
if (ch == '"')
state = 0;
else if (ch == '\\')
state = 8;
}
else if (state == 8)
state = 7;
if ((state == 0 && ch != '/') || state == 5 || state == 6 || state == 7 || state == 8)
{
cout << ch;
fputc(ch, p2);
}
}
return state;
}
// c的注释不可以嵌套,/*必须闭合
运行展示
去除注释后