使用 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 linecode is as follows:
int main() /// 主功能
{
int a, b, c;
a = b + c;
}
说明- 字符串 /* 表示多行注释,包括第 1 行和第 6-9 行。字符串 // 将第 4 行表示为注释。
解决这个问题的方法
我们将像理想的编译器一样逐行解析字符串。当我们遇到 // 或 '/* /*.' 时,我们将忽略这些块引号之间和之后的所有字符。
函数 removeString(vector<string>&source) 将源代码作为输入并在删除其注释后返回代码。
布尔变量comment 被初始化为false,它将检查特定的字符串或字符块是否是一个注释。
如果我们开始一个块注释并且我们不在块中,那么我们将跳过接下来的两个字符并更改我们在该特定块中的状态。
如果我们结束一个块注释并且我们在一个块中,我们将跳过接下来的两个字符并将我们的状态更改为不在一个块中。
如果我们开始一行注释并且不在块中,我们将忽略该行的其余部分。
如果我们不在块注释中(并且它不是注释的开始),我们将记录我们所在的字符。
如果我们不在每行末尾的块中,我们将记录该行。
该算法以O(source)时间复杂度运行。源是输入字符串。
示例
#include<bits/stdc++.h>输出结果using namespace std;
vector<string>removeComments(vector<string>&source){
vector<string>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<string>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() // Main function{
int a, b, c; // 多变的 declaration
/* This is a test multiline comment for testing */
a = b + c;
}”);
vector<string>res= removeComments(source);
for(auto x:res){
cout<<x;
}
return 0;
}
["int main()","{ "," ","int a, b, c;","a = b + c;","}"]The line by linecode is visualized as below:
int main(){
int a, b, c;
a = b + c;
}
以上是 使用 C++ 删除字符串中的注释 的全部内容, 来源链接: utcz.com/z/327625.html