使用C++移除字符串中的注释


给定一个C++程序作为输入,从中删除注释。'source'是一个向量,其中第i行源代码是source[i]。这表示通过换行符'\n'分割源代码字符串的结果。在C++中,我们可以创建两种类型的注释,即行注释和块注释。

字符串'//'表示行注释,这意味着它右侧的字符串将被程序忽略。

字符串'/*'和'*/'是多行注释,表示从'/*'到'*/'之间的字符串将被忽略。

第一个有效的注释优先于其他注释:如果字符串'//'出现在块注释中,则会被忽略。类似地,如果字符串'/*'出现在行注释或块注释中,也会被忽略。如果删除注释后某一行代码为空,则不应输出该行——答案列表中的每个字符串都将是非空的。

例如:

输入1

source = ["/*Test program */", "int main()", "{ ", " // variable
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(){
   // variable 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() /// Main Function
{
   int a, b, c;
   a = b + c;
}

解释:字符串'/*'表示多行注释,包括第1行和第6-9行。字符串'//'表示第4行为注释。

解决这个问题的方法

  • 我们将像理想的编译器那样逐行解析字符串。当我们遇到'//'或'/*'时,我们将忽略这些块引用之间和之后的所有字符。

  • 函数removeString(vector<string>&source)接收源代码作为输入,并返回删除注释后的代码。

  • 布尔变量comment初始化为false,它将检查特定字符串块或字符是否为注释。

  • 如果我们开始一个块注释并且我们不在块中,那么我们将跳过接下来的两个字符并改变我们在这个特定块中的状态。

  • 如果我们结束一个块注释并且我们在这个块中,我们将跳过接下来的两个字符并将状态更改为不在块中。

  • 如果我们开始一个行注释并且不在块中,我们将忽略该行的其余部分。

  • 如果我们不在块注释中(并且它不是注释的开始),我们将记录我们所在的字符。

  • 如果我们不在每一行结束时的块中,我们将记录该行。

  • 该算法的时间复杂度为O(source)。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()", "{ ", " // variable 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; // variable 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 line
code is visualized as below:
int main(){
   int a, b, c;
   a = b + c;
}

更新于:2021年2月5日

902 次浏览

开启您的职业生涯

完成课程获得认证

开始学习
广告