-
OpenJudge-去除C程序中的注释
-
题目链接:
-
思路:
注释方式只有一种: /* ..... */ 且不能嵌套注释
所以分三种情况:
1.当前字符不在注释或字符串中,如果不是注释或字符串标记符,直接输出,否则改变状态(注释中/字符串中)
2.字符在注释中:检查字符是否能构成 ” */ “ ,如果是,注释状态解除,否则注释中的字符不输出
3.字符在字符串中:检查字符是否为 ‘ ” ’ ,并且!!前面不得是 //” ,正常输出
坑:
其实最坑是在字符串中,涉及转义字符 //,如果 ” 前有转义字符,那么该字符 ” 也是字符串的一部分
-
代码:
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
string Str, Str_Plus;
int In_Str , In_Node ;
int main()
{
while (getline(cin, Str))
Str_Plus += Str + '\n';
int Index = 0;
while (Index != Str_Plus.size() - 1)
{
//不在注释也不在字符串中
while (!In_Node && !In_Str&&Index < Str_Plus.size() - 1)
{
//注释开始符
if (Str_Plus[Index] == '/'&&Str_Plus[Index+1] == '*')
{
In_Node = 1;
Index += 2;
}
//字符串开始符
else if (Str_Plus[Index] != '\\'&&Str_Plus[Index + 1] == '"') //遇到转义字符直接输出就ok
{
In_Str = 1;
cout << Str_Plus[Index] << Str_Plus[Index + 1];
Index += 2;
}
else
cout << Str_Plus[Index++];
}
//在字符串中,要判断结尾,如果双引号前是 \\ 则不是结尾
while (In_Str&&Index < Str_Plus.size() - 1)
{
if (Str_Plus[Index] == '\\'&&Str_Plus[Index + 1] == '"')
{
cout << Str_Plus[Index] << Str_Plus[Index + 1];
Index += 2;
}
//真正结尾标志
else if (Str_Plus[Index] == '"')
{
In_Str = 0;
cout << Str_Plus[Index++];
}
else
cout << Str_Plus[Index++];
}
//在注释中,只遍历不输出直到注释结束
while (In_Node&&Index < Str_Plus.size() - 1)
{
if (Str_Plus[Index] == '*'&&Str_Plus[Index + 1] == '/')
{
In_Node = 0;
Index += 2;
}
else
Index++;
}
}
return 0;
}