使用 C++ 删除字符串中的注释
给定一个C++程序作为输入,删除其中的注释。'source'是一个向量,其中源代码的第i行是source[i]。这表示通过换行符\n拆分源代码字符串的结果。在C++中,我们可以创建两种类型的注释,即行注释、块注释。
字符串'\\'表示行注释,这意味着程序将忽略它右侧旁边的字符串。
字符串'\*和*\'是一个多行注释,表示从'\*开始直到*\'将被忽略的字符串。
第一个有用的注释优先于其他注释:如果字符串//出现在块注释中,它将被忽略。同样,如果字符串/*出现在行或块注释中,它也会被忽略。如果删除注释后某行代码为空,则不得输出该行-答案列表中的每个字符串都将为非空。
例如-
输入1-
source = ["/*Test program */", "int main()", "{ ", " //多变的 declaration ", "int a, b, c;", "/* This is a test", " multiline ", " comment for ", " testing */", "a = b + c;", "}"] The line by line code is as follows: /*Test program */ int main(){ //多变的 declaration int a, b, c; /* This is a test multiline comment for testing */ a = b + c; }
输出-
["int main()","{ "," ","int a, b, c;","a = b + c;","}"]The line by line code is as follows: int main() ///主功能 { int a, b, c; a = b + c; }
说明-字符串/*表示多行注释,包括第1行和第6-9行。字符串//将第4行表示为注释。
解决这个问题的方法
我们将像理想的编译器一样逐行解析字符串。当我们遇到//或'/*/*.'时,我们将忽略这些块引号之间和之后的所有字符。
函数removeString(vector
布尔变量comment被初始化为false,它将检查特定的字符串或字符块是否是一个注释。
如果我们开始一个块注释并且我们不在块中,那么我们将跳过接下来的两个字符并更改我们在该特定块中的状态。
如果我们结束一个块注释并且我们在一个块中,我们将跳过接下来的两个字符并将我们的状态更改为不在一个块中。
如果我们开始一行注释并且不在块中,我们将忽略该行的其余部分。
如果我们不在块注释中(并且它不是注释的开始),我们将记录我们所在的字符。
如果我们不在每行末尾的块中,我们将记录该行。
该算法以O(source)时间复杂度运行。源是输入字符串。
示例
#includeusing namespace std; vector removeComments(vector &source){ vector ans; string s; bool comment= false; for(int i = 0; i < source.size(); i++) { for(int j = 0; j < source[i].size(); j++) { if(!comment && j + 1 < source[i].size() && source[i][j] == '/' && source[i][j+1]=='/') break; else if(!comment && j + 1 < source[i].size() && source[i][j] == '/' && source[i][j+1]=='*') comment = true; j++; else if(comment && j + 1 < source[i].size() && source[i][j] == '*' && source[i][j+1]=='/') comment = false; j++; else if(!comment) s.push_back(source[i][j]); } if(!comment && s.size()) ans.push_back(s), s.clear(); } return ans; } int main(){ vector source (“ source = ["/*Test program */", "int main()", "{ ", " //多变的 declaration ", "int a, b, c;", "/* This is a test", " multiline ", " comment for ", " testing */", "a = b + c;", "}"] The formatted code can be interpreted as - /*Test program */ int main() //Mainfunction{ int a, b, c; //多变的 declaration /* This is a test multiline comment for testing */ a = b + c; }”); vector res= removeComments(source); for(auto x:res){ cout< 输出结果 ["int main()","{ "," ","int a, b, c;","a = b + c;","}"]The line by line code is visualized as below: int main(){ int a, b, c; a = b + c; }